这是我写的内容,用于检查输入是否为正整数
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int isInt(char num[3]) {
int l = strlen(num);
int x;
for ( x = 0; x < l; x++) {
if ( ! isdigit(num[x]) )
return 0;
}
return 1;
}
int main(void) {
int i;
char str[3];
printf("Enter a positive integer: ");
scanf("%s", str);
if ( isInt(str) == 1 ) {
i = atoi(str);
printf("%d \n", i);
} else {
printf("This is not a positive integer! \n");
}
return 0;
}
我发现了一些意想不到的行为,尽管该程序似乎可以工作:
我是否
#include <ctype.h>
或不,都没有什么区别。怎么可以isdigit()
函数可以在没有库的情况下工作吗? (我在 ubuntu 14.04 上使用 gcc 4.9.3)如果我强加
str
成为长度为 3 的字符串,当我运行./a.out
时怎么可能?它检查正确并打印大于 999 的数字?如果我输入5678不应该str
只存567?或者也许它会保存前 2^3 位数字?我很困惑如果我想检查一个字符串是否为正整数,但数字可能很大,那么
str
应该多大?是?有没有办法让它根据需要变大?
最佳答案
头文件不是库;它是一个库。它只说明如何使用图书馆。如果省略头文件,那么编译器将不得不猜测函数采用哪些参数,但如果它猜测正确(或足够接近),那么所有内容都可能工作正常。 (实际上它不会“猜测”;当然是有规则的。)
您没有对
str
的长度“施加”限制,您保留了 3 个字节的空间。如果您超出了该保留,则程序可能(或可能不会)继续正常工作,但您可能会发现其他数据已意外损坏。没有可靠的方法来预测哪些数据将被覆盖;它是未定义的。不,在用户输入之前无法知道该数字有多大,但您可以使用
%3s
设置读取的最大字符数,例如。但是,您需要确保为字符串末尾的'\0'
nul 字符终止符保留足够的空间。您还可以使用 scanf 的替代方法来读取 block 中的数据,但使用“大”缓冲区和最大字段宽度可能是最安全的。请注意,scanf 可以直接读取数字,而无需您将其作为字符串读取,然后自己进行转换。
关于c - C 中整数检查的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38455852/