Return of atoi() - C 函数

Return of atoi() - C function

我有随机字符串,我想对它们进行排序。我需要找到那些只包含数字的(比如 xyz..., x,y,z 是数字);使用什么功能?

我试过了atoi("3=fyth433")。但是那个 returns 3。对于包含无法解析为整数的字符的字符串,我期待它 return 0

你可以用一个简单的测试:

if (*buf && buf[strspn(buf, "0123456789")] == '[=10=]') {
    /* buf only contains decimal digits */
}

strspn() returns 第一个参数开头与第二个字符串中的一个字符匹配的字符数。 *buf 上的额外测试避免匹配空字符串。 空字符串只包含数字是正确的,因为它根本不包含任何内容。

如果 buffgets 读取,您将检查 '\n' 而不是 '[=18=]',但正如 chux 正确指出的那样,有一个极端情况如果最后一行不以换行结束:

#include <string.h>
#include <stdio.h>

...

char line[256];
while (fgets(line, sizeof line, stdin)) {
    size_t ndigits = strspn(line, "0123456789");
    if (ndigits > 0 && (line[ndigits] == '\n' || line[ndigits] == '[=11=]')) {
        /* line only contains decimal digits */
    } else {
        /* line is empty or contains at least one non digit character */
    }
}

您也可以使用 <ctype.h> 中的函数 isdigit(),但必须注意不要直接传递 char 值,因为它们可能为负值,从而调用未定义的行为。这是一个替代方案:

int string_has_only_digits(const char *str) {
    if (!*str) // empty string
        return 0;
    while (isdigit((unsigned char)*str))
        str++;
    return *str == '[=12=]';
}

您不能为此使用 strtol,因为它接受白色 space 的初始序列和一个可选符号。