fgets不会停止阅读用户输入

时间:2018-07-16 12:20:34

标签: c fgets

我在reddit上发现了一些挑战,希望编写一个程序来汇总所有DnD骰子掷骰。抛出次数不受限制,因此我创建了while循环。

我使用fgets输入字符串,(我不能只输入整数,因为输入例如是1d3,其中1是抛出的骰子数量,而3是抛出的骰子的边数。)

当提示用户输入骰子时,fgets永远不会停止读取用户输入。

例如:

To end inputting dice type 0
1d3 
1d4
1d5
0
0
^C

主要功能:

int main(void)
{
    char input[MAXSIZE];
    int sum = 0;
    printf("To end inputting dice type 0\n");
    while(*(input) != 0);
    {
        fgets(input, sizeof(input), stdin);
        printf("Debug: input = ");
        puts(input);
        printf("\n");
        sum += dice(input);
        printf("Debug: sum = %d\n", sum);
    }
    printf("Sum of dice rolls is %d.", sum);
    return 0;
}

4 个答案:

答案 0 :(得分:3)

首先,字符输入0的字面值不是0。在ASCII中,它是48(十进制)。

尝试

 while(*(input) != '0')  // (1) - use the character literal form
                         // (2) remove the ;

也就是说standard output is usually line buffered。如果要在终端中查看输出,则需要强制刷新。您可以通过

  • 添加换行符

     printf("Debug: input = \n");
    
  • 使用fflush(stdout)

答案 1 :(得分:1)

尝试一下:-

  Workbooks("AnotherWorkbook.xlsx").Sheets(1).row(1).delete

while(fgets(input, sizeof input, stdin) != NULL)

答案 2 :(得分:1)

这个问题真的很简单,这样的初学者错误甚至问到这个问题我都感到羞耻。

while循环后的分号。

谢谢大家的帮助。

答案 3 :(得分:0)

char input[MAXSIZE] = { 0 }; // initialise input!
// otherwise you get to here and access an uninitialised variable:
while(*(input) != 0); // <--- and a semicolon right there!!! Remove that!

实际上,我认为您想要的循环是while (fgets(input, sizeof input, stdin) && strcmp(input, "0\n")) ...请注意,我已经将fgets提升到了循环控制表达式中。

例如,您可能应该在调用fgets之后进行检查,以确保读取了换行符

while (fgets(input, sizeof input, stdin) && strcmp(input, "0\n")) {
    size_t n = strcspn(input, "\n");
    if (input[n] == '\n') input[n] = '\0';
    else assert(input[n] == '\0'), // #include <assert.h>
         fscanf(stdin, "%*[^\n]"),
         fgetc(stdin);

使用fscanf时,没有与读取无符号整数相关的未定义行为,因此,如果仅计划使用正值,则可以使用fgets代替unsigned dice_count, dice_sides; while (fscanf(stdin, "%ud%u", &dice_count, &dice_sides) == 2) { printf("You chose to roll %u times with dice that contain %u sides\n", dice_count, dice_sides); } ,即

Call DB Procedure