2015-12-10 4 views
-4

Необходимо преобразовать строку в unsigned int в C. Я попытался с помощью sscanf() и strtoul(), но оба из них на вводе отрицательных цифр, как -123 переворачивает их и не сигналы об ошибке.Как преобразовать строку в unsigned int? с

Я имею в виду, что strtoul(-1) вернет UNSIGNED_INT_MAX - 1, а не ошибку.

мне нужно что-то, что будет делать так:

"123" - отлично

"-123" - неправильный

"WeWe" - неправильный

"123wew" - неправильно

+0

Параметр 'endptr'' strtoul' будет указывать на первый символ в строке, которая не является частью действительной целочисленной константы без знака; если это не пробел или '0', то вход недействителен. –

+2

Это не хороший дубликат. OP хочет преобразование в * unsigned *. Это не так просто, как кажется. Я думаю, вы можете использовать 'strtoul' и проверить, может ли результат (' unsigned long') вписываться в 'unsigned'. – Bathsheba

+0

Просто добавьте, если вам нужно что-то особенное для ваших потребностей, вы можете развернуть свою собственную функцию. Вы знаете, что большинство функций библиотеки являются универсальными. :) –

ответ

4

Вы можете попробовать проверить все индивидуальные символы строки, чтобы убедиться, что они являются цифрами (isdigit() - ваш друг) - и затем, если это пройдет, c alling strtoul. Некоторые могут утверждать, что вы могли бы сделать вызов regexp или что-то вместо этого - но в конце дня что-то должно будет сделать эту проверку.

unsigned int convert(char *st) { 
    char *x; 
    for (x = st ; *x ; x++) { 
    if (!isdigit(*x)) 
     return 0L; 
    } 
    return (strtoul(st, 0L, 10)); 
} 

(я «возвращать ноль», если строка является недействительной - вам придется изменить поведение по своему вкусу ")

+0

Спасибо! Это способ решения этого вопроса – PinkiNice

+0

Это хороший случай, когда 'continue' может улучшить читаемость кода. –

+0

Лучше использовать 'NULL', чем' 0L' в 'strtol (const char * nptr, char ** endptr, int base);' – chux

0

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"); 
    } 
}  
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; 
} 

Таким образом, ведущие пробелы и '+' по-прежнему разрешено.

1

Чтобы получить возвращаемое значение ошибки от функции, а также без знака 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; 
} 
Смежные вопросы