是否有必要在一个循环的内部和外部使用两个scanf或getchar()?

是否有必要在一个循环的内部和外部使用两个scanf或getchar()?,c,scanf,string-length,getchar,C,Scanf,String Length,Getchar,我在练习本上看到这个计算字符长度的小程序,我有点困惑。为什么有两个getchar,一个在循环外部,一个在循环内部 我在循环外部删除了getchar,没有看到任何区别。如果我删除它会有什么后果吗 代码如下: #include <stdio.h> char ch; int len; printf("Enter your message:"); ch = getchar(); while(ch != '\n') { len++; ch = getchar(); } p

我在练习本上看到这个计算字符长度的小程序,我有点困惑。为什么有两个getchar,一个在循环外部,一个在循环内部

我在循环外部删除了getchar,没有看到任何区别。如果我删除它会有什么后果吗

代码如下:

#include <stdio.h>
char ch;
int len;

printf("Enter your message:");
ch = getchar();

while(ch != '\n') {
    len++;
    ch = getchar();
}

printf("Your message is %d characters long", len);
return 0;

这是我的修改版本,我不知道是否有任何严重的后果,因为输出是相同的:

#include <stdio.h>
char ch;
int len;

printf("Enter your message:");

while(ch != '\n') {
    ch = getchar();
    len++;
}

printf("Your message is %d characters long", len);
return 0;


如果外部没有getchar,则ch的值不会初始化,这意味着可能会从它开始,并且循环永远不会运行。此外,在循环中,报告的长度比实际长度a\n长一倍,而实际长度a\n应为1。如果外部没有getchar,则ch的值不会初始化,这意味着可能会从它开始,并且循环永远不会运行。此外,在循环中,报告的长度比实际长度a\n大一倍,当长度应为1时,显示为长度2。

这两个代码段都可能调用,因为len可能不会初始化,除非它是全局变量,在这种情况下,它将被初始化为0,尽管没有充分的理由这样做

替换代码有两个缺陷,删除外部getchar会使程序在初始化之前对ch求值,再次调用未定义的行为,并且它比char数组的实际长度多计算一个字符

有几种方法可以解决此问题,其中之一是将while更改为do-while循环,并将len初始化为-1:


这两个代码段都可能被调用,因为len可能不会被初始化,除非它是一个全局变量,在这种情况下,它将被初始化为0,尽管没有充分的理由这样做

替换代码有两个缺陷,删除外部getchar会使程序在初始化之前对ch求值,再次调用未定义的行为,并且它比char数组的实际长度多计算一个字符

有几种方法可以解决此问题,其中之一是将while更改为do-while循环,并将len初始化为-1:


呜呜\n'第一次在您的版本中运行时,ch没有初始化,使用它会导致未定义的行为,假设您的所有代码实际上都在一个函数中。int ch。。。。而ch=getchr!='\n’&&ch!=EOF更常见。该程序计算我练习本中的字符长度和字符长度;而不是int-ch;暗示OP需要一本更好的书。@anastaciu-它是全局的,默认初始化为零,现在为什么它是全局的是另一个问题-它没有写得那么有意义。@DavidC.Rankin,一定是这样,因为没有函数出现,所以可以假设。whilech!='\n'第一次在您的版本中运行时,ch没有初始化,使用它会导致未定义的行为,假设您的所有代码实际上都在一个函数中。int ch。。。。而ch=getchr!='\n’&&ch!=EOF更常见。该程序计算我练习本中的字符长度和字符长度;而不是int-ch;暗示OP需要一本更好的书。@anastaciu-它是全局的,默认情况下初始化为零,现在为什么它是全局的是另一个问题-它没有写得那么有意义。@DavidC.Rankin,一定是这样,因为没有函数提供,可以这样假设。噢,谢谢!我没有注意到我修改过的版本的结果比原始版本多一个,如果可以的话,你能告诉我为什么原始版本是正确的,而我的版本在输出中是错误的吗?原始版本在增加长度之前检查字符,你的版本在检查字符之前增加长度。哦,谢谢!我没有注意到我修改过的版本的结果比原始版本多一个,如果可以的话,你能告诉我为什么原始版本是正确的,而我的版本在输出中是错误的吗?原始版本在增加长度之前检查字符,你的版本在检查字符之前增加长度。
#include <stdio.h>

int main() {

    int ch, len = -1;

    printf("Enter your message:");

    do {        
        ch = getchar();
        len++;
    } while (ch != '\n' && ch != EOF); //allways a good practice to check for EOF

    printf("Your message is %d characters long", len);
    return 0;
}