注册 登录
编程论坛 C++教室

请教从string 对象中去掉标点符号的疑问

发布于 2010-05-10 18:30, 2690 次点击
大家好:请教各位高手个问题(红色标注)
编一个程序,从string 对象中去掉标点符号。要求输入到程序的字符串必须含
有标点符号,输出结果则是去掉标点符号后的string 对象。
int main()
{
string s, result_str;
bool has_punct = false;
char ch;
//输入字符串
cout << "Enter a string:" << endl;
getline(cin, s);
//处理字符串:去掉其中的标点
for (string::size_type index = 0; index != s.size(); ++index)
{
ch = s[index];
if (ispunct(ch))
has_punct = true; 这句的作用是什么?既然ispunct检测到标点符号返回ture就该接着处理,那为什么result_str += ch;要放在else后?
这样一来是不是将处理标点符号的作用给跳过去了呢???

else
result_str += ch;
}
if (has_punct)
cout << "Result:" << endl << result_str <<endl;
else {
cout << "No punctuation character in the string?!" << endl;
return -1;
}
return 0;
}
谢谢大家此看帖
3 回复
#2
lintaoyn2010-05-10 19:19
for (string::size_type index = 0; index != s.size(); ++index)
{
ch = s[index];//按序逐个地提取s中的字符
if (ispunct(ch))//如果当前字符是特殊字符
has_punct = true; //那么就做下记号说s里面有特殊字符。接着提取下个字符。(就是标记作用,说s里面有特殊字符,没有别的自用了)
else//如果当前字字符不是特殊字符
result_str += ch;//那么把它加在result_str的尾部。
}
当然了去掉has_punct = true; 也行,改写成
if(!ispunct(ch))
result_str +=ch;
只是最后输出时要做下判断。s.size() == result_str.size();

今天高兴所以话有些多。
#3
2010-05-10 22:10
非常感谢 我想通了 自己看来还得好好静下心来学 采用你建议的if(!ispunct(ch))
result_str +=ch;使语句简化不少,我后来调试的结果是对的,但是我不确定你说最后输出s.size() == result_str.size();的判断有没有存在的必须性  
盼复




int main()
{
string s, result_str;
bool has_punct = false;
char ch;
//输入字符串
cout << "Enter a string:" << endl;
getline(cin, s);
//处理字符串:去掉其中的标点
for (string::size_type index = 0; index != s.size(); ++index)
{
ch = s[index];
if(!ispunct(ch))
result_str +=ch;
}
cout<<result_str<<endl;

return 0;
}

#4
lintaoyn2010-05-11 07:11
不是原字符串在不存在特殊符号的情况下还要输出"No punctuation character in the string?!" 么?如果不用对用户提示这一情况,那么就不用在输出前做一次判断。
1