需要在C中将字符串转换为unsigned int
我尝试过使用sscanf()
和strtoul()
,但是他们在输入负数(如-123
时)都会将它们反转,并且不会发出错误信号。
我的意思是,strtoul(-1)
将返回UNSIGNED_INT_MAX - 1
而非错误。
我需要一些能够这样做的东西:
" 123" - 很好
" -123" - 错误
" wewe" - 错误
" 123wew" - 错误
答案 0 :(得分:4)
您可以尝试检查字符串的所有单个字符,以确保它们是数字(isdigit()
是您的朋友) - 然后如果通过,则调用strtoul。有些人可能会争辩说你可以做一个正则表达式或者其他事情 - 但是在一天结束时,必须要做一些检查。
unsigned int convert(char *st) {
char *x;
for (x = st ; *x ; x++) {
if (!isdigit(*x))
return 0L;
}
return (strtoul(st, 0L, 10));
}
(我"返回零"如果字符串无效 - 您必须根据自己的喜好更改行为")
答案 1 :(得分:2)
为了从函数和unsigned int获取错误返回值,您可以执行以下操作。代码是自我解释的。
#include <stdio.h>
#include <stdlib.h>
int atoui(char *in,unsigned int *out);
int main()
{
char str[4][7] = {{"123"},
{"-123"},
{"wewe"},
{"123wew"}};
unsigned int ui,
uc;
for(uc = 0; uc < 4; uc++)
if(atoui(str[uc],&ui)) printf("ERROR: %s\n",str[uc]);
else printf("OK: %u\n",ui);
return 0;
}
int atoui(char *in,unsigned int *out)
{
char *p;
for(p = in; *p; p++)
if (*p > '9' || *p < '0')
return 1;
*out = strtoul(in, NULL, 10);
return 0;
}
答案 2 :(得分:1)
strtoul
会将endptr
设置为指向输入字符串中的第一个非数字字符;但是,它没有捕捉到符号(因为,毕竟,你可以写unsigned int x = -1;
)。
所以你必须分两个阶段做到这一点;首先,你必须寻找领先的-
;如果找不到,请使用strtoul
进行转换,然后检查endptr
:
char input[N];
char *p;
while ( fgets( input, sizeof input, input_stream ) )
{
p = input;
while ( isspace( *p ) ) // skip over any leading whitespace
p++;
if ( !isdigit( *p ) )
{
printf( "\"%s\" is not a valid unsigned integer string\n" );
}
else
{
char *endptr;
unsigned int val = (unsigned int ) strtoul( p, &endptr, 0 );
if ( isspace( *endptr) || *endptr == 0 )
printf( "\"%s\" is a valid unsigned integer string: %u\n", val );
else
printf( "\"%s\" is *not* a valid integer string\n" );
}
}
答案 3 :(得分:1)
只需找'-'
,然后拨打strtoul()
。
unsigned long PN_strtoul(const char *s, int *fail) {
*fail = strchr(s, '-') != NULL;
char *endptr;
errno = 0;
unsigned long ul = strtoul(s, &endptr, 10);
// overflow? no conversion? trailing junk?
if (errno || endptr == s || *endptr) *fail = 1;
return ul;
}
这样,仍允许前导空格和'+'
。