使用toupper()处理字符串导致无限循环

时间:2018-08-02 00:32:35

标签: c++ argv

我正在尝试编写一个程序,将每个单词的一个字母转换为大写。 argv[1]是一个类似3的数字。如果argv[1]3,则每个单词的第三个字母应为大写,其他单词应为小写。

我写了这样的代码灾难,它陷入了一个无限循环,该循环仅重复显示第一个输入字符。

我需要逻辑上的帮助。

#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    int c;  // yes, read chars in as ints.
    int ncounter = atoi(argv[1]);
    int cchecker = 0;

    c = cin.get();
    while (!cin.eof()) 
    {
        if (c == ' ')
        {
            cchecker = 0;
        }
        else 
        {
            if (cchecker == ncounter) 
            {
                c = (toupper(c));
                cchecker++;
            }
            else 
            {
                c = (tolower(c));
                cchecker++;
            }
        }

        cout.put('\n'); // sometimes this is needed: you'll know when
    }
}

更新这是新的代码,它几乎可以完美地工作,除了它有时不会将第一个单词大写,有点奇怪。

#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

int main (int argc, char *argv[])
{
    int c ;  // yes, read chars in as ints.
    int ncounter = atoi(argv[1]);
    int cchecker = 0;

    c = cin.get() ;
    while (!cin.eof())
    {
        if (c == ' ')
        {
            cchecker = 0;
            cout.put (c);
            c = cin.get ();
            cchecker++;
        }
        else
        {
            if (cchecker == ncounter)
            {
                cout.put (toupper(c));
                c = cin.get() ;
                cchecker++;
            }
            else
            {
                cout.put (tolower(c));
                c = cin.get() ;
                cchecker++;
            }
        }
    }
    cout.put('\n') ; // sometimes this is needed: you'll know when
}

2 个答案:

答案 0 :(得分:2)

while (!cin.eof())

您的循环条件表明,如果在上次迭代中设置了标准输入流(由std::cin对象表示)的eofbit,则循环结束。当那里没有更多字符时,将在从标准输入读取时设置Eofbit。

  

它陷入了无限循环

您的循环永远不会从标准输入中读取数据,因此循环条件的状态永远不会改变。如果进入循环,它将永远不会停止。

答案 1 :(得分:0)

正如其他人所述,进入循环之前,您只能读std::cin一次,因此您陷入了无限循环,因为您再也不会在循环内调用cin.get()了,所以{{ 1}}有机会改变价值。不过,您应该考虑使用cin.eof()而不是while (cin.get(ch))

但是,为什么您一次要从while (!cin.eof())读一个std::cin?您说要更改单词中的字母,因此您应该阅读整个单词,而不是单个字符。

尝试在循环中使用char来读取整个单词,替换该单词中的第N个operator>>,例如:

char