c - 如何在 scanf 时检查你只得到整数(如 2)而不是整数后跟字符(如 2c)
问题描述
我正在尝试扫描一个整数以查看它在我的程序中是否合法。但是,如果我输入一个数字后跟一个字符,它仍然将其视为合法数字(我的猜测是它在将字符保存在缓冲区中时只引用整数)。假设我只能使用 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
是
如果输入无效,它不会“停止”:它已被读取。
如果有错误,字符串很容易被转储并请求另一个字符串。
推荐阅读
- amazon-sagemaker - 如何在不使用笔记本内置算法的情况下预处理 s3 上的训练数据
- z3 - 链接到静态编译的 z3 需要 Linux 上的其他库
- python - sklearn category_encoders 中的 TargetEncoder 和 BinaryEncoder 是什么?
- javascript - 无论如何使用正则表达式和 jstree.searchColumn?
- dart - Flutter - 如何以非异步方法从共享偏好中获取价值
- excel - 如何在字符串定义的范围内搜索值?
- c# - FFMPEG 出现错误 - 文件名或扩展名太长
- ionic4 - 如何将 html 设置为应用程序的主页
- amazon-web-services - AWS S3 存储桶策略 - 原则语法
- angular - 我应该为与 RxJS 的简单交互编写一个单元测试吗