#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
main()
{
string str1;
char strArray[80];
cout << "Enter string: ";
getline(cin, str1);
transform(str1.begin(), str1.end(), str1.begin(), ::tolower);
for(int i = 0;i < str1.length();i++)
{
if(str1[i] == ' ' || str1[i] == ',' || str1[i] == '.')
{
}
else
{
strArray[i] = str1[i];
}
}
cout << strArray;
return 0;
}
for循环在找到空格,逗号或句点后会一直停止。有人可以向我解释为什么会这样吗?
答案 0 :(得分:1)
问题是即使您从输入中删除了一个字符,i
也会继续递增。它实际上并没有停止,只是跳过一个角色。由于strArray
现在有一个洞,因此很可能洞中填充了0
,从而结束了C字符串。附:这种行为无法保证,您可能会在另一次运行程序时得到完全不同的结果。
答案 1 :(得分:0)
当您调用erase时,它会影响容器,因此您需要处理此问题。 erase()将迭代器返回到已删除的元素之后的下一个元素,因此您应该使用它:
int i = 0;
for(string::iterator it = str1.begin(); it != str1.end(); )
{
if(*it == ' ' || *it == ',' || *it == '.')
{
it = str1.erase(it);
}
else
{
strArray[i++] = *it++;
}
}
strArray[i] = '\0'; // terminate string
答案 2 :(得分:0)
你可以发布为str1输入的字符串吗?因为我尝试运行它,它运行良好,没有停止。我在代码中找到的唯一问题就是你擦除了循环中的char,这将导致错误的结果字符串。
答案 3 :(得分:-1)
您正在删除字符串中的字符,同时仍继续递增计数器。从++i
循环中删除for
。把它放在else
条款下。
for(int i = 0;i < str1.length();)
{
if(str1[i] == ' ' || str1[i] == ',' || str1[i] == '.')
{
str1.erase(i, 1);
}
else
{
strArray[i] = str1[i];
++i;
}
}
strArray[str1.length()] = '\0';