C 简单的字符计数程序表现得很奇怪

C 简单的字符计数程序表现得很奇怪,c,bash,input,getchar,C,Bash,Input,Getchar,此代码应计算用户输入的字符数,但“\n”除外,除“\n”紧跟在其他“\n”之后。我以后再解释 #include <stdio.h> int main () { int numberOfChars = 0; do { while(getchar() != '\n') numberOfChars++; } while(getchar() != EOF &am

此代码应计算用户输入的字符数,但“\n”除外,除“\n”紧跟在其他“\n”之后。我以后再解释

#include <stdio.h>

int main () {
        int numberOfChars = 0;

        do {
                while(getchar() != '\n')
                        numberOfChars++;
        } while(getchar() != EOF && numberOfChars++);

        printf("Number of chars = %d\n", numberOfChars);

        return 0;
}

我使用的是OS X-10.10.5、bash-3.2和clang-700.1.81

提前感谢。

您有2个
getchar()
调用-任何一个都可以读取EOF或'\n'。您需要重构,以便只有一个
getchar()

e、 g.在您的第一个示例中,没有“\n”,因此您永远不会退出内部while循环。在第四个示例中,第二个'\n'由第二个
getchar
读取,因此您再次陷入内部。

您有两个
getchar()
调用-任何一个都可以读取EOF或'\n'。您需要重构,以便只有一个
getchar()


e、 g.在您的第一个示例中,没有“\n”,因此您永远不会退出内部while循环。在您的第四个示例中,第二个'\n'由第二个
getchar
读取,因此您再次陷入内部。

当内部循环返回
EOF
时,这不等于
'\n'
,因此循环再次尝试,获得另一个
EOF
,并且它仍然不是
'\n'
,因此它还有另一次尝试。电脑很有耐心

在内部循环中,使用:

int c;
while ((c = getchar()) != EOF && c != '\n')
    numberOfChars++;
这将在EOF或到达线路末端时停止


另请参阅您的附件中的讨论-尽管我错过了内部循环的EOF问题。

当内部循环返回
EOF
时,这并不等于
'\n'
,因此循环会重试,获得另一个
EOF
,但它仍然不是
'\n'
,因此它还有另一次尝试。电脑很有耐心

在内部循环中,使用:

int c;
while ((c = getchar()) != EOF && c != '\n')
    numberOfChars++;
这将在EOF或到达线路末端时停止


另请参阅我随附的讨论-尽管我错过了内部循环的EOF问题。

对Jonathan的上述答案进行了轻微修改(以确保循环仅使用EOF停止,而不是“\n”):

编辑:同样,这是单循环解决方案(不需要外循环和内循环)


对Jonathan的上述回答稍作修改(以确保循环仅以EOF停止,而不是“\n”):

编辑:同样,这是单循环解决方案(不需要外循环和内循环)


首先,我必须为我问题中令人困惑的描述道歉:

。。。。。。除了 '\n',预期'\n'在其他'\n'之后

我的意思是:

。。。。。。除了 (“\n”,期望“\n”跟在其他“\n”后面)

所以在我的第四个例子中没有输入错误

最后,我提出了一个解决方案:

#include <stdio.h>

int main () {
        int numberOfChars = 0;

        int c;
        do {
                while((c = getchar()) != '\n' && c != EOF )
                        numberOfChars++;
                while((c = getchar()) == '\n')
                        numberOfChars++;
        } while(c != EOF && numberOfChars++);

        printf("Number of chars = %d\n", numberOfChars);

        return 0;
}
#包括
int main(){
int numberOfChars=0;
INTC;
做{
而((c=getchar())!='\n'&&c!=EOF)
numberOfChars++;
而((c=getchar())=='\n')
numberOfChars++;
}而(c!=EOF&&numberOfChars++);
printf(“字符数=%d\n”,numberOfChars);
返回0;
}

我相信这段代码可以很好地演示我想要的内容。

首先,我必须为问题中令人困惑的描述道歉:

。。。。。。除了 '\n',预期'\n'在其他'\n'之后

我的意思是:

。。。。。。除了 (“\n”,期望“\n”跟在其他“\n”后面)

所以在我的第四个例子中没有输入错误

最后,我提出了一个解决方案:

#include <stdio.h>

int main () {
        int numberOfChars = 0;

        int c;
        do {
                while((c = getchar()) != '\n' && c != EOF )
                        numberOfChars++;
                while((c = getchar()) == '\n')
                        numberOfChars++;
        } while(c != EOF && numberOfChars++);

        printf("Number of chars = %d\n", numberOfChars);

        return 0;
}
#包括
int main(){
int numberOfChars=0;
INTC;
做{
而((c=getchar())!='\n'&&c!=EOF)
numberOfChars++;
而((c=getchar())=='\n')
numberOfChars++;
}而(c!=EOF&&numberOfChars++);
printf(“字符数=%d\n”,numberOfChars);
返回0;
}

我相信这段代码可以很好地演示我想要的内容。

循环将不仅为EOF终止,而且为“\n”终止。有一个标准“expect'\n's following other'\n'”——这意味着'\n'不应该停止循环。@SiddharthaGhosh:外部循环处理这个问题-我只是没有在我的回答中重复外部循环,因为我没有提出任何更改。是否需要两个循环(外部和内部)?计数可以用一个循环完成。在我看来,不需要两个循环。然而,OP提出了双循环作为一个问题的答案,其中原始代码给出的答案是预期答案的两倍,因为该问题的OP忘记(或没有意识到)换行符是字符。请参阅链接。在这种情况下,问题是“为什么这个双循环没有正确终止”,而不是“这是计数字符的好方法吗”。循环将不仅为EOF终止,而且为“\n”终止。有一个标准“expect'\n's following other'\n'”——这意味着'\n'不应该停止循环。@SiddharthaGhosh:外部循环处理这个问题-我只是没有在我的回答中重复外部循环,因为我没有提出任何更改。是否需要两个循环(外部和内部)?计数可以用一个循环完成。在我看来,不需要两个循环。然而,OP提出了双循环作为一个问题的答案,其中原始代码给出的答案是预期答案的两倍,因为该问题的OP忘记(或没有意识到)换行符是字符。请参阅链接。在这种情况下,问题是“为什么这个双循环没有正确终止”,而不是“这是计数字符的好方法吗”。非常简单,但在我的第四个示例中,这将输出3,我希望是4。在你的第四个示例中,输出应该是3。根据此问题中的问题描述,“计数字符…除了'\n',期望'\n'跟在另一个'\n''--因此,这应该排除两个'enter'。这是我的错:实际上我的意思是“除了('\n',期望'\n'跟在另一个'\n')”。英语不是我的母语。对不起,t