【问题标题】:Use of getchar() in for statement does not work as expected在 for 语句中使用 getchar() 无法按预期工作
【发布时间】:2016-12-27 06:05:50
【问题描述】:

下面的代码没有按预期工作,有人可以给我一些建议吗?

#include <stdio.h>
int main(){
    int i, k=0, j=0;
    char hex[50], c;
    for (i=0; (c=getchar()) != EOF && (c=getchar()) != '\n'; i++) {
        hex[i] = c;
        j++;
    }
    if (c == 'n') {
        hex[i] = 'n';
        i++;
    }
    hex[i] = '\0';
    for (k=0; k<i; k++) {
        printf("%c", hex[k]);
    }
    printf("\n%d %d %d\n", i, j, k);
    return 0;
}

如果我输入:

abc

我想输出应该是:

abc
4 3 4

但是,在我的 Xcode IDE 中,输出是:

b
1 1 1

有人可以帮我调试我的代码吗?

【问题讨论】:

    标签: c getchar


    【解决方案1】:

    当你说

    for (i=0; (c=getchar()) != EOF && (c=getchar()) != '\n'; i++)
    

    编译器首先评估c=getchar()) != EOF 并将第一个字符作为输入。然后,如果它是真的,它评估(c=getchar()) != '\n'。现在c 的值是'b'

    你应该说

    for (i=0; (c=getchar()) != EOF && c != '\n'; i++)
    

    因为c 已经初始化为'a'

    编辑:正如@Stargateur 所说,当您不知道操作持续多长时间以及等待某些输入结束操作时,您应该使用while。将for 循环用于受限操作,例如对已知数量的项目进行操作(例如结构的数组)。

    【讨论】:

    • 我要补充一点,这个for 循环应该转换为while 循环。因为for 循环用于迭代,但在这里你不会迭代你循环直到getchar() 返回\nEOF。所以while 循环会更惯用。
    【解决方案2】:

    这样修复

    #include <stdio.h>
    
    int main(void){
        int i, j, k, c;//The type of c must be int.
        char hex[50];
    
        for (j = i = 0; i < sizeof(hex)-1 && (c=getchar()) != EOF && c != '\n'; i++, j++) {//The input part should be one.
            hex[i] = c;
        }
        if (c == '\n') {//n is typo as \n
            hex[i] = '\n';
            i++;
        }
        hex[i] = '\0';
    
        for (k = 0; k < i; k++) {
            printf("%c", hex[k]);
        }
        printf("%d %d %d\n", i, j, k);//newline already include.
        return 0;
    }
    

    【讨论】:

    • 你能告诉我为什么c的类型必须是int吗?我将使用 char 类型的 hex[] 为 c 赋值。
    • @user7241487 需要和EOF比较。 getchar 返回 0..255 和 -1(EOF)。 255('\xFF'EOF)不应混淆。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2020-03-05
    相关资源
    最近更新 更多