Разбор целых чисел в строку C - PullRequest
19 голосов
/ 26 января 2009

Как можно разобрать целое число в string(char* || char[]) в C? Есть ли эквивалентный Integer.parseInt(String) метод из Java в C?

Ответы [ 9 ]

47 голосов
/ 26 января 2009

Если вы хотите преобразовать целое число в строку, попробуйте функцию snprintf().

Если вы хотите преобразовать строку в целое число, попробуйте функцию sscanf() или atoi() или atol().

15 голосов
/ 26 января 2009

Чтобы преобразовать int в строку:

int x = -5;
char buffer[50];
sprintf( buffer, "%d", x );

Вы также можете сделать это для пар:

double d = 3.1415;
sprintf( buffer, "%f", d );

Чтобы преобразовать строку в int:

int x = atoi("-43");

См. http://www.acm.uiuc.edu/webmonkeys/book/c_guide/ для документации этих функций.

10 голосов
/ 26 января 2009

Звучит так, как будто у вас есть строка и вы хотите преобразовать ее в целое число, судя по упоминанию parseInt, хотя это не совсем вполне ясно из вопроса ...

Для этого используйте strtol. Эта функция немного сложнее, чем atoi, но в свою очередь она обеспечивает более четкое указание условий ошибки, поскольку может заполнить указатель (который предоставляет вызывающая сторона) адресом первого символа, который запутал ее. Затем вызывающая сторона может исследовать символ, вызывающий ошибку, и решить, была ли строка действительной или нет. atoi, напротив, просто возвращает 0, если он потерян, что не всегда полезно - хотя, если вы довольны этим поведением, вы можете использовать его.

Ниже приведен пример использования strtol. Проверка на наличие ошибок очень проста: если первым нераспознанным символом был не '\x0', заканчивающий строку, то считается, что строка не содержит допустимого значения int.

int ParseInt(const char *s,int *i)
{
    char *ep;
    long l;

    l=strtol(s,&ep,0);

    if(*ep!=0)
        return 0;

    *i=(int)l;
    return 1;
 }

Эта функция заполняет * i целым числом и возвращает 1, если строка содержит допустимое целое число. В противном случае возвращается 0.

2 голосов
/ 26 января 2009

Это обсуждается в C часто задаваемых вопросах Стива Саммита.

1 голос
/ 26 января 2009

Вы также можете проверить функцию atoi() (от целого до целого) и ее родственников, atol и atoll и т. Д.

Кроме того, есть функции, которые также делают обратное, а именно itoa() и co.

1 голос
/ 26 января 2009

Функция Java parseInt() анализирует строку для получения целого числа. Эквивалентная функция C - atoi(). Тем не менее, это не соответствует первой части вашего вопроса. Вы хотите преобразовать целое число в строку или строку в целое число?

0 голосов
/ 22 марта 2015

Это не оптимальное решение. Это мое решение с учетом многочисленных ограничений, поэтому, если у вас были ограниченные ресурсы в соответствии с рекомендациями вашего курса / инструктора, это может подойти вам.

Также обратите внимание, что это часть моего собственного проекта, и мне пришлось читать операнды и цифры, поэтому я использовал getchars. В противном случае, если вам нужны только целые числа и никаких других символов, мне нравится использовать это:

int k;
while (scanf("%d", &k) == 1)

Правила не были конкретными, «продвинутыми» концепциями C: без строковых переменных, без структур, без указателей, без методов, не охваченных, и единственное включение, которое нам было разрешено, было # include

Так что без простых вызовов методов, таких как atoi () или каких-либо строковых переменных, я выбрал просто грубую силу.

1: читать символы в getchar (fgets был забанен). вернуть 1 (выход из состояния 1), если есть недопустимый символ Для вашей проблемы на основе parseInt в Java 1 11 13 допустимо, но 1 11 1a недопустимо, поэтому для всех значений у нас есть допустимая «строка», если все символы 0-9 игнорируют пробел.

2: преобразовать значение ASCII символа в его целочисленное значение (например, 48 => 0)

3: использовать переменную val для хранения int таким образом, чтобы для каждого символа в подстроке была соответствующая целая цифра. то есть "1234" => 1234 добавить это к массиву int и установить val в 0 для повторного использования.

Следующий код демонстрирует этот алгоритм:

int main() {
    int i, c;
    int size = 0;
    int arr[10]; //max number of ints yours may differ
    int val = 0;
    int chars[1200]; //arbitrary size to fit largest "String"
    int len = 0;

    //Part 1: read in valid integer chars from stdin
    while((c = getchar()) != EOF && (c < 58 && c > 47)) {
        chars[len] = c;
        len++;
     }

    //Part 2: Convert atoi manually. concat digits of multi digit integers and  
    //        append to an int[]
    for(i = 0; i < len; i++){
    for(i = 0; i < len; i++){
        if(chars[i] > 47 && chars[i] < 58){
        while((chars[i] > 47 && chars[i] < 58)){
            if(chars[i] == 48)
                c = 0;
            if(chars[i] == 49)
                c = 1;
            if(chars[i] == 50)
                c = 2;
            if(chars[i] == 51)
                c = 3;
            if(chars[i] == 52)
                c = 4;
            if(chars[i] == 53)
                c = 5;
            if(chars[i] == 54)
                c = 6;
            if(chars[i] == 55)
                c = 7;
            if(chars[i] ==56)
                c = 8;
            if(chars[i] == 57)
                 c = 9;
            val = val*10 + c;
            i++;
        }
        arr[size] = val;
        size++;
        if(size > 10) //we have a check to ensure size stays in bounds
           return 1;
        val = 0;
        }
        //Print: We'll make it a clean, organized "toString" representation
        printf("[");
        for(i = 0; i < size-1; i++){
            printf("%d, ", arr[i]); 
        }
        printf("%d]", arr[i];

        return 0;

Опять же, это метод грубой силы, но в таких случаях, как мой, когда вы не можете использовать концепции методов, которые люди используют профессионально, или различные инструменты C99, это может быть то, что вы ищете.

0 голосов
/ 10 декабря 2012

Вы можете попробовать:

int intval;
String stringval;
//assign a value to intval here.
stringval = String(intval);

это должно сработать.

0 голосов
/ 26 января 2009

Возможно, вы захотите взглянуть на совместимое решение на этом сайте .

...