在for语句中使用getchar()不能按预期工作

时间:2016-12-27 06:05:51

标签: c getchar

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

#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

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

2 个答案:

答案 0 :(得分:2)

当你说

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

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

你应该说

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

因为c已初始化为'a'

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

答案 1 :(得分:0)

像这样修复

#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;
}