如何将字符串转换为unsigned int? C

时间:2015-12-10 16:03:04

标签: c string scanf type-conversion

需要在C中将字符串转换为unsigned int 我尝试过使用sscanf()strtoul(),但是他们在输入负数(如-123时)都会将它们反转,并且不会发出错误信号。

我的意思是,strtoul(-1)将返回UNSIGNED_INT_MAX - 1而非错误。

我需要一些能够这样做的东西:

" 123" - 很好

" -123" - 错误

" wewe" - 错误

" 123wew" - 错误

4 个答案:

答案 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;
}

这样,仍允许前导空格和'+'