为什么 for 循环总是在 else 语句处停止

Why does the for loop keep stopping at else statement?

本文关键字:语句 else for 循环 为什么      更新时间:2023-10-16
#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 循环在找到空格、逗号或句点后会停止。有人可以向我解释为什么会发生这种情况吗?

问题是即使您从输入中删除了一个字符,i也会不断递增。它实际上并没有停止,只是跳过一个角色。由于strArray现在有一个洞,所以这个洞很可能被0填满,从而结束了 C 弦。附言不能保证这种行为,在程序的另一次运行时,您最终可能会得到完全不同的结果。

当你调用 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] = ''; // terminate string

你能发布你为 str1 输入的字符串吗?因为我尝试运行它,它运行良好,没有停止。我在你的代码中找到的唯一属性是你擦除循环中的字符,这将导致错误的结果字符串。

您正在从字符串中删除字符,同时仍继续递增计数器。从for循环中删除++i。将其放在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()] = '';