如果用户输入一个字符串,而不是用strtok保存它的每一部分,其中一个部分是数字,我怎么能把这个数字转换成整数? 我的目标是得到这个字符串:"矩阵3 3",并验证用户没有输入double或float,只是整数num。我试图做铸造,但它没有用 THX!
答案 0 :(得分:0)
有不同的可能方式,但涉及
我的目标是[...]验证用户没有输入double或float,只是整数。
您可能希望获得完整的输入验证。在这种情况下,您必须使用strtol()
。
#include <stdlib.h>
#include <limits.h>
int main(void)
{
const char *str = "42"; // in your code, some result from strtok
char *endptr;
long num = strtol(str, &endptr, 10);
if (endptr == str || *endptr)
{
// not parsed successfully
return 1; // error and out ... do whatever is suitable
}
if (num > INT_MAX || num < INT_MIN)
{
// value was outside int range
return 1;
}
int x = (int)num;
return 0;
}
如果您确实需要long
来检查范围,请在致电errno
之前将0
设置为strtol()
,然后再检查errno == ERANGE
。 (包括errno.h
)
为了完整起见,作为回应to your comment,当然你可以手动完成所有操作,但这很乏味且容易出错并且效率低下,所以我从不推荐这样做。请在此处查看从字符串中解析无符号整数的示例,并进行错误检查:
#include <stdio.h>
#include <string.h>
// write result to *result, return 0 on error, 1 on success:
int parseuint(unsigned int *result, const char *str)
{
if (!str || !*str) return 0;
size_t len = strlen(str);
unsigned char bcd[len];
for (size_t i = 0; i < len; ++i)
{
if (str[i] < '0' || str[i] > '9') return 0;
bcd[i] = str[i] - '0';
}
size_t scanstart = 0;
*result = 0;
unsigned int mask = 1;
while (scanstart < len)
{
if (!mask) return 0;
if (bcd[len-1] & 1) *result |= mask;
mask <<=1;
for (size_t i = len-1; i > scanstart; --i)
{
bcd[i] >>= 1;
if (bcd[i-1] & 1) bcd[i] |= 8;
}
bcd[scanstart] >>= 1;
while (scanstart < len && !bcd[scanstart]) ++scanstart;
for (size_t i = scanstart; i < len; ++i)
{
if (bcd[i] > 7) bcd[i] -= 3;
}
}
return 1;
}
int main(void)
{
unsigned int a;
if (parseuint(&a, "4258"))
{
printf("parsed: %u\n", a);
}
else
{
puts("error parsing 4258");
}
if (parseuint(&a, "13.7"))
{
printf("parsed: %u\n", a);
}
else
{
puts("error parsing 13.7");
}
if (parseuint(&a, "12345678901234567890"))
{
printf("parsed: %u\n", a);
}
else
{
puts("error parsing 12345678901234567890");
}
}