【问题标题】:C program on Mac works unexpectedMac 上的 C 程序运行异常
【发布时间】:2021-08-29 14:17:03
【问题描述】:

我有这个小程序:

#include <stdio.h>

int main(){
    int c;
    while(c != EOF){
        printf("Enter character\n");
        c = getchar();
        printf("Character: %c\n", c);
    }
    printf("FIN\n");
    return 0;
}

终端的输出看起来很奇怪,因为 while 循环在输入字符后执行了两次:

Enter character
a
Character: a                //This should be the last output after a char was entered, but the loop gets executed a second time without waiting for a keyboard-input:
Enter character
Character: 

Enter character

 

在终端中,我正在编译和运行这样的代码:

gcc main.c
./a.out

我做错了什么?

感谢您的回答,它是通过 enter ... 输入的 lf。这很明显:D

【问题讨论】:

    标签: c while-loop char scanf getchar


    【解决方案1】:

    对于初学者,您的程序具有未定义的行为,因为您在 while 循环的条件下使用了未初始化的变量 c

    int c;
    while(c != EOF){
    //...
    

    函数getchar 还读取空白字符,例如按 Enter 键后放入缓冲区中的换行符 '\n'

    另一个问题是你在读取并输出变量c后检查它

    while(c != EOF){
        printf("Enter character\n");
        c = getchar();
        printf("Character: %c\n", c);
    }
    

    你应该使用scanf而不是getchar作为例子

    char c;
    
    while ( scanf( " %c", &c ) == 1 )
    {
        //...
    }
    

    注意转换说明符%c前的空白。此空白表示将跳过空白字符。

    【讨论】:

    • 非常感谢。我失去了很多基础知识,因为过去五年我必须专门编写 javascript :(
    【解决方案2】:

    只要您按下enter,就会在输入流中添加一个换行符。所以你的程序实际上读取了两个字符:a\n。这个换行符由getchar() 读取并在第二次迭代中分配给c,您实际上可以看到它被打印为空行。在打印c 之前,您可以使用break 语句退出循环:if (c == '\n') break;

    如果你输入abc,你会看到c后面打印了一个空行。

    【讨论】:

    • 非常感谢。当我读到你的答案时很明显。
    【解决方案3】:

    您正在输入 2 个字符,“a”和 LF。

    直到两个都被处理后才进行while测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      相关资源
      最近更新 更多