使用 scanf 读取除换行符外别无其他的整数

Using scanf to read an integer with nothing else but a newline character

有没有一种方法可以使用 scanf(不使用任何其他 I/O 函数)来检查用户输入是否仅存在一个整数且后面没有任何内容?

例如:

int g;
while(scanf("%d", &g)!=1){
    printf("\nincorrect input, try again");
}

这适用于像“/”或“-”这样的输入,但是当您输入“54.32”时,它将读取到“.”,scanf 的读取计数将为 1,并且 54 将存储在 g 中.有没有办法检查输入是否仅由一个整数组成,后跟一个换行符?

我想知道是否有不使用 fgets 或任何其他 IO 函数的解决方案?

to check solely of a single integer followed by nothing but a newline character

使用 "%n" 记录扫描的字符数,如果它到达那么远。

int n = 0;
scanf("%d*1[\n]%n", &g, &n);
if (n > 0) puts("input consists solely of a single integer followed by a newline");

如果结果不是所希望的,则需要额外的代码来处理错误的输入。

我建议使用fgets()来解决更大的问题。

您可以使用禁止赋值的格式运算符提取整数后的所有内容,并使用 number-of-characters-read 格式说明符查看是否匹配任何东西,无需将其存储在任何地方。

看看你的documentation

例如,

int g, gchars, xchars;
scanf("%d%n%*s%n", &g, &gchars, &xchars);
if (xchars > gchars)
    printf("%d extra characters discarded after integer %d\n", xchars-gchars, g);

编辑因为我误解了问题:这个怎么办?

#include <stdio.h>

int main() {

    int n;
    char c;

    scanf("%d", &n);

    scanf(" %c", &c) ? printf("incorrect input, try again\n") : printf("%d\n", n);

    return 0;
}