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
上的额外测试避免匹配空字符串。 空字符串只包含数字是正确的,因为它根本不包含任何内容。
如果 buf
被 fgets
读取,您将检查 '\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 的初始序列和一个可选符号。
我有随机字符串,我想对它们进行排序。我需要找到那些只包含数字的(比如 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
上的额外测试避免匹配空字符串。 空字符串只包含数字是正确的,因为它根本不包含任何内容。
如果 buf
被 fgets
读取,您将检查 '\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 的初始序列和一个可选符号。