c - 当我在控制台中输入一封信时,这是怎么回事?

标签 c

所以我在用

#include <stdio.h>
int main()
{
    while(true){
        int n, c, k, space = 1;
        printf("pick a number between 1 and 25\n");
        scanf("%d", &n);
        space = n - 1;
        for (k = 1; k <= n; k++) {
            for (c = 1; c <= space; c++)
               printf(" ");
            space--;
            for (c = 1; c <= 2*k-1; c++)
               printf("*");
            printf("\n");
        }
        space = 1;
        for (k = 1; k <= n - 1; k++)
        {
            for (c = 1; c <= space; c++)
                printf(" ");
            space++;
            for (c = 1 ; c <= 2*(n-k)-1; c++)
               printf("*");
            printf("\n");
        }
    }
}

当您输入数字时,该程序运行良好。 但是当你输入一个字母时,它会这样做

pick a number between 1 and 25
pick a number between 1 and 25
pick a number between 1 and 25

它会一直这样做,直到您退出应用程序。

现在,我知道这是由于 while(true) 造成的,但为什么要输出它呢?这是特定于某个处理器的吗?

编辑:您必须先输入一个字母才能重现问题

最佳答案

此行为是跨处理器和 C(和 C++)实现的标准行为。

问题是您在预期会找到数字的地方输入了一个字母。由于它没有找到数字,它将字母留在输入队列中,并且尝试读取数字失败。然后你再重复一遍。你没有做任何事情来删除这封信,所以它会再次尝试读取一个数字,并且(当然)再次失败。

基本上,在您读取输入的任何时候,您都想检查读取是否成功。因为您使用的是 scanf,所以您可以检查它的返回值。它返回它成功读取的项目数,所以在这种情况下你可以这样做:

printf("Please pick a number between 1 and 25");
if (scanf("%d", &number) == 1)
    // we got a number
else
    // bad input.

在“错误输入”的情况下,您通常希望从输入中读取字符直到换行,然后再次尝试读取数字。

关于c - 当我在控制台中输入一封信时,这是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39188016/

相关文章:

c - 如何将目录名称正确存储到链表中?

c - 在 C 中使用 makefile 变量

c - 帮助创建一个简单的 C shell

c - 为什么这个结构定义会额外增加一个字节的内存使用量?

c - 传递数组第一个元素的地址时,为什么要写&Array[0]而不是Array?

c - Mico C 虚拟机分段故障

c - 自由二维数组列

c - 如何在 .bundle 文件中模拟 objdump --dwarf=decodedline?

c++ - 是否存在通过引用选择元素和通过指针操作选择元素都有效的情况?

c - 将 C 中的标点符号与单词分开