【发布时间】:2020-07-25 09:43:44
【问题描述】:
当我在 C 中使用时:
int x = 0;
char str[] = " \t123abc";
x = atoi(str);
printf("%d\n", str); //123
123 被打印出来。我想知道如果字符串不完全是整数,是否有一个“严格”的 C 函数返回 0。 (我不关心数字符号(总是正数)和底数(总是 10))。
一些例子:
" \t123abc" -> 0
" 123abc" -> 0
"123abc" -> 0
" 123 " -> 0
"123" -> 123
"123\n" -> 0
目前我创建了一个int sstoi (char *str) 函数来执行此操作:
static const unsigned int pow10[10] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
int sstoi (char *str) {
int result = 0, length = strlen(str);
char c;
if (length > 10) return 0;
for (int i = 0; i < length; i++) {
c = str[i];
if (c < 48 || c > 57) return 0;
result += (c-48)*pow10[length-i-1];
}
return result;
}
我认为应该改进:有人可以帮助我吗?
【问题讨论】:
-
无需使用 10 的幂。只需转到
result = result * 10 + (c - '0')。最好不要使用幻数,注意我使用了'0'。length > 10约束太松,因为值仍然可以溢出 32 位。 -
使用
strtol()。检查字符串不为空且没有前导空格,然后让strtol()设置一个指向第一个无效字符的指针——如果它指向终止的 null,则整个字符串是好的。
标签: c type-conversion