当我使用循环时发生了什么?

时间:2019-03-21 17:49:38

标签: c getchar gets

    for(i = 0; i < n; i++)
    {
        gets(s[i]);
    }
for(i = 0; i<n; i++)
    {
        if (s[i][0] > 91)
            arr[i] = s[i][0] - 32;
        else
            arr[i] = s[i][0];
    }
    for(i = 0; i < n; i++)
        printf("%d ",arr[i]);

我正在取名为arr的数组中n个字符串的每个第一个字母的ascii值。但是get仅运行(n-1)次,例如,如果n = 5,那么我应该可以使用gets获得5个字符串,但只能让我接受4个字符串。问题是第一个字符串。因为FIRST字符串的第一个字母的ascii值始终为0。例如,

input : n = 5
a
b
c
d \\ won't let me take another input
output :
0 65 66 67 68

现在我已经在堆栈上的其他问题的帮助下找到了解决方案。在出现以下情况之前添加getchar:

for(i = 0; i < n; i++)
    {
        getchar();
        gets(s[i]);
    }

然后就可以了。但是我不知道出什么问题了,为什么使用getchar可以解决这个问题。请告诉我这是怎么回事。

N.B.我知道使用获取很危险。但是我正在学习c,因此熟悉其他所有c函数。从其他堆栈问题来看,我认为gets的问题在于它无法读取'\ n',但是我的代码中根本没有'\ n'。

1 个答案:

答案 0 :(得分:1)

该程序将fgets用于所有输入,以解决由scanf leaving the newline in the input buffer引起的问题:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char input[81];
    int count;

    printf("input : n = ");
    fgets(input, sizeof(input), stdin);
    sscanf(input, "%d\n", &count);
    int *array = calloc(count, sizeof(int));
    for (int index = 0; index < count; index++) {
        fgets(input, sizeof(input), stdin);
        int digit = input[0];
        if (digit > 91) {
            array[index] = digit - 32;
        }
        else {
            array[index] = digit;
        }
    }
    for (int index = 0; index < count; index++) {
        printf("%d ", array[index]);
    }
    printf("\n");
    free(array);

    return 0;
}

示例

[user@machine]: ./scratch
input : n = 5
a
b
c
d
e
65 66 67 68 69 

注意

该程序不进行错误检查,并向int传递size_t而不是calloc。此代码不应在生产环境中使用。