c - C 中整数检查的意外行为

标签 c string integer type-conversion

这是我写的内容,用于检查输入是否为正整数

#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;
}

我发现了一些意想不到的行为,尽管该程序似乎可以工作:

  1. 我是否 #include <ctype.h>或不,都没有什么区别。怎么可以isdigit()函数可以在没有库的情况下工作吗? (我在 ubuntu 14.04 上使用 gcc 4.9.3)

  2. 如果我强加 str成为长度为 3 的字符串,当我运行 ./a.out 时怎么可能?它检查正确并打印大于 999 的数字?如果我输入5678不应该str只存567?或者也许它会保存前 2^3 位数字?我很困惑

  3. 如果我想检查一个字符串是否为正整数,但数字可能很大,那么 str 应该多大?是?有没有办法让它根据需要变大?

最佳答案

  1. 头文件不是库;它是一个库。它只说明如何使用图书馆。如果省略头文件,那么编译器将不得不猜测函数采用哪些参数,但如果它猜测正确(或足够接近),那么所有内容都可能工作正常。 (实际上它不会“猜测”;当然是有规则的。)

  2. 您没有对 str 的长度“施加”限制,您保留了 3 个字节的空间。如果您超出了该保留,则程序可能(或可能不会)继续正常工作,但您可能会发现其他数据已意外损坏。没有可靠的方法来预测哪些数据将被覆盖;它是未定义的。

  3. 不,在用户输入之前无法知道该数字有多大,但您可以使用 %3s 设置读取的最大字符数,例如。但是,您需要确保为字符串末尾的 '\0' nul 字符终止符保留足够的空间。您还可以使用 scanf 的替代方法来读取 block 中的数据,但使用“大”缓冲区和最大字段宽度可能是最安全的。请注意,scanf 可以直接读取数字,而无需您将其作为字符串读取,然后自己进行转换。

关于c - C 中整数检查的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38455852/

相关文章:

integer - 快速将 UInt 转换为 Int

在 C 中创建固定大小的链表

c - 读取文件时出错

c - 处理 fscanf()

Python 在字符串中插入 "\"

c - scanf() 和 printf() 中的字符串变量名之前的 & 符号或没有 & 符号?

python - 如何检查整数小数点后的值是否为零

MySQL整数默认值0

c - 如何从汇编指令到 C 代码

c - 这是什么排序算法?