C++ 使用do-while循环| C+对字符串中的字符、单词和行进行计数+;

C++ 使用do-while循环| C+对字符串中的字符、单词和行进行计数+;,c++,visual-c++,C++,Visual C++,我正在尝试将一个对字符串中的字符、单词和行进行计数的while循环转换为do while循环 这是我的while循环: #包括 #包括 #包括 使用名称空间std; int main() { INTC; 整数字符=0; int字=1; int换行符=0; printf(“输入字符串。按enter键,然后按ctrl+Z,然后再次输入以结束字符串。\n”); 而((c=getchar())!=EOF) { 如果(c>='a'&&c='a'&&c问题: 你试图做的事情完全是反自然的,毫无意义。你展示的

我正在尝试将一个对字符串中的字符、单词和行进行计数的
while
循环转换为
do while
循环

这是我的
while
循环:

#包括
#包括
#包括
使用名称空间std;
int main()
{
INTC;
整数字符=0;
int字=1;
int换行符=0;
printf(“输入字符串。按enter键,然后按ctrl+Z,然后再次输入以结束字符串。\n”);
而((c=getchar())!=EOF)
{

如果(c>='a'&&c='a'&&c问题:

你试图做的事情完全是反自然的,毫无意义。你展示的情况应该使用
while
循环,而不仅仅是任何循环

解决方案:

从技术上讲,您仍然可以这样做,但这是非常糟糕的风格:

do
{
bool do_end=(c=getchar())!=EOF;
如果(结束)
打破

如果((c>='a'&&c='a'&&c则发布的
do
-
while
循环存在两个主要问题

第一个是,您正在读取两个字符,但在循环的每个迭代中只处理字符

第二个问题是
而(c=getchar()!=EOF)
并没有达到您希望的效果
while(c=(getchar()!=EOF))

这仍然不好,因为这条线有利于检测EOF,但字符会被忽略,以便进一步处理


您必须将
do
-
while
循环更改为:

do 
{
    c = getchar();
    if ( c == EOF )
    {
        break;
    }

    if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
        characters++;
    else if (c == ' ')
        words++;
    else if (c == '\n')
        newlines++;
} while (true);
do
{
c=getchar();
如果(c==EOF)
{
打破
}

如果(c>='a'&&c='a'&&c如其他人所述,那么您所描述的情况更适合使用正常的
while
循环,而不是
do…while
。然而,尽管如此,也不需要解决代码中的其他问题(如注释中提到的问题),只需给“控制变量”一个在循环内没有影响的初始“虚拟”值,就可以更改许多这样的循环。在您的情况下,
c
的零值几乎不可能成为实际的输入值,因此您可以使用:

int c=0;//给c一个初始(非)值。
做
{
//c=getchar();//删除此行,因为它会对每个循环进行两次“读取”!

如果(c>='a'&&c='a'&&c,带
do/的
while
您正在跳过其他每一个字符。计算
getchar
调用和每个调用后面的逻辑。顺便说一句,如果是空字符串,单词计数将为1。此外,在具有多个相邻空格的字符串中,计数将不正确。感谢大家的响应。我已经学习了这是我的第一篇博文。我很高兴我很烂,因为这意味着我可以从你们身上学到更多;)知道什么时候你可能会很烂也很好..或者你用一个read:
int c=getchar()来“初始化”
c
变量谢谢C++,加里。只是通过执行Dewhile while循环的过程,我可以知道它比一个while循环效率要低得多。我是C++新手,尝试通过各种流控制,更好地理解它们是如何工作的。我现在正在尝试。使用开关函数解决同样的问题。感谢“使用命名空间std;”上的输入。您共享的链接非常有用。
while ((c = getchar()) != EOF);
do 
{
    c = getchar();
    if ( c == EOF )
    {
        break;
    }

    if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
        characters++;
    else if (c == ' ')
        words++;
    else if (c == '\n')
        newlines++;
} while (true);