我正在尝试扫描一个整数以查看其在程序中是否合法。但是,如果我输入的数字后跟一个字符,它仍会将其视为合法数字(我的猜测是,在将字符保存在缓冲区中时,它仅引用整数)。假设我只能使用scanf,而不能使用其他任何东西(因为这是我们精益求精的目的)。另外,如果我仅输入一个字符,它将自动将其转换为整数。到目前为止,这是我在这里所看到的帮助下尝试过的-
int number_of_numbers;
char number='\n';
printf("Enter size of input:");
if (scanf("%d%c",&number_of_numbers, &number)>=1 && number!='\n')
{
printf("Invalid size");
return 0;
}
当我仅扫描一个整数或一个整数后跟一个字符或一个字符时,如何识别?谢谢!
如果输入“仅字符”,则不会“自动将其转换为整数”。它不接受根本没有任何输入,如scanf返回0
所示,但是这种情况使您无法进行测试。
但是您的问题的答案是:有困难使用scanf
时。
这里是一种通过fgets
获取输入的方法。它可以容忍数字前后的空白,但不能容忍任何字母。
%c
前留空格的原因是指示其过滤所有前导空格。无论如何,这对于%d
都是自动的,但对于%c
则不是自动的。然后,如果没有可读字符,则不会将任何内容读入extra
。如果至少有一个字符(空格除外),则sscanf
转换计数将不正确。
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
int number_of_numbers = 0;
while(number_of_numbers >= 0) {
bool success = false;
char str[100];
if(fgets(str, sizeof str, stdin) != NULL) {
char extra;
if(sscanf(str, "%d %c", &number_of_numbers, &extra) == 1) {
success = true;
}
}
if(success) {
printf("Success: %d\n\n", number_of_numbers);
} else {
printf("Invalid size\n\n");
}
}
return 0;
}
计划会议:
123
Success: 123
123a
Invalid size
123 a
Invalid size
123 9
Invalid size
a
Invalid size
-1
Success: -1
使用fgets
的原因是
如果输入无效,它不会“停顿”:它已经被读取。
如果有错误,可以很容易地将字符串转储并请求另一个。