【问题标题】:c++ : Help correcting endless loop while modifying c-string arrayc++:在修改 c 字符串数组时帮助纠正无限循环
【发布时间】: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

标签: c++ c arrays string c-strings


【解决方案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;

因为在您的代码中,您正在打印超出数组范围的第一个字符。

【讨论】:

  • 非常感谢!我的代码现在完美运行。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 2023-03-09
  • 2014-10-04
  • 1970-01-01
相关资源
最近更新 更多