c++:在修改 c 字符串数组时帮助纠正无限循环
Posted
技术标签:
【中文标题】c++:在修改 c 字符串数组时帮助纠正无限循环【英文标题】:c++ : Help correcting endless loop while modifying c-string array 【发布时间】:2015-12-01 00:08:28 【问题描述】:我有一个家庭作业,其中涉及从用户输入创建一个 c 字符串数组,修改数组的内容,使每个其他字母大写,并输出最终结果。我的代码目前陷入无限循环。我很难准确理解如何访问数组然后修改它。 (我们这周才开始使用数组。)我在下面粘贴了我的代码。任何帮助表示赞赏!
#include <iostream>
#include <cctype>
#include <string>
#include <cstring>
const int j = 1024;
using namespace std;
int main()
char letter;
char lineArray[j];
char modifyArray[j];
cout << "Hello! Please type a letter, word, " //user input prompt
<< "or phrase, followed by enter." << endl;
cin.getline(lineArray, j);
for(int i=0; i < 1024; i++)
letter = lineArray[i];
while (letter != '\n') //change and store letters
if (i%2 == 0)
letter = toupper(letter);
else if(i%2 != 0)
letter = tolower(letter);
modifyArray[i] = letter;
cout << modifyArray[j];
return 0;
【问题讨论】:
并非每一行都以 '\n' 结尾。在迭代之前计算字符串的长度。 如果第一个字母是'A'
,那么while
循环将无限循环,因为'A' != '\n'
,改成'a'
也没关系,因为@987654326 @ 也不等于 '\n'
。外部循环应该是for(int i=0;lineArray[i]!='\0';i++)
,而while
只需要消失即可。
while (letter != '\n')
- 离开这里的唯一方法是将字母设置为'\n'
- 你永远不会这样做...... - 也不需要说else if (i%2 != 0)
,只需说else
。
【参考方案1】:
在下面的代码sn-p
letter = lineArray[i];
while (letter != '\n') //change and store letters
if (i%2 == 0)
letter = toupper(letter);
else if(i%2 != 0)
letter = tolower(letter);
您正在基于letter
循环,但在循环内部,它不会以永远更改为'\n'
的方式更改。
另外,当使用getline
时,'\n'
字符(换行符)不会被放入字符串中,因此您与'\n'
的比较是没有意义的。相反,将您的 for 循环更改为以下内容(并删除 while 循环):
for(int i=0; i < strlen (lineArray) + 1; i++) // You need strlen + 1, because otherwise string terminating '\0' character wouldn't be copied over.
这样,您将准确地循环字符串的长度(假设 in 永远不会超过 1024 个字符。
另外,你应该像这样打印数组:
cout << modifyArray;
因为在您的代码中,您正在打印超出数组范围的第一个字符。
【讨论】:
非常感谢!我的代码现在完美运行。非常感谢您的帮助。以上是关于c++:在修改 c 字符串数组时帮助纠正无限循环的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?