Как я могу извлечь целое число из строки? - PullRequest
8 голосов
/ 25 марта 2020

Я работаю над заданием, и как часть его мне нужно извлечь целое число из строки.

Я пытался использовать функцию atoi(), но она всегда возвращает 0 Итак, я переключился на strtol(), но он все еще возвращает 0.

Цель состоит в том, чтобы извлечь целые числа из строки и передать их в качестве аргументов другой функции. Я использую функцию, которая затем использует эти значения для обновления некоторых данных (update_stats).

Пожалуйста, имейте в виду, что я довольно плохо знаком с программированием на языке C, но это был мой попытка:

void get_number (char str[]) {
    char *end;
    int num;
    num = strtol(str, &end, 10);
    update_stats(num);
    num = strtol(end, &end, 10);
    update_stats(num);
}

Цель этого в строке "e5 d8" (например). Я бы извлек * 5 и 8 из этой строки.

Формат строки всегда одинаковы.

Как я могу это сделать?

Ответы [ 3 ]

7 голосов
/ 25 марта 2020

strtol не не находит число в строке. Он преобразует число в начале строки . (Он пропускает пробелы, но больше ничего.)

Если вам нужно найти, где начинается число, вы можете использовать что-то вроде:

const char* nump = strpbrk(str, "0123456789");
if (nump == NULL) /* No number, handle error*/

(man strpbrk)

Если ваши номера могут быть подписаны, вам нужно что-то более сложное. Один из способов - выполнить вышеизложенное, а затем создать резервную копию одного символа, если предыдущий символ - -. Но следите за началом строки:

if ( nump != str && nump[-1] == '-') --nump;

Простое помещение - в аргумент strpbrk приведет к ложным совпадениям при вводе, например non-numeric7.

2 голосов
/ 25 марта 2020

Предлагаю вам написать логи c самостоятельно. Я знаю, это как изобретать велосипед , но в этом случае вы поймете, как на самом деле работают библиотечные функции.

Вот функция, которую я предлагаю:

bool getNumber(str,num_ptr)
char* str;
long* num_ptr;
{
    bool flag = false;
    int i = 0;
    *num_ptr = 0;
    char ch = ' ';
    while (ch != '\0') {
        ch = *(str + i);
        if (ch >= '0' && ch <= '9') {
            *num_ptr = (*num_ptr) * 10 + (long)(ch - 48);
             flag = true;
        }
        i++;
    }
    return flag;
}

Не забудьте передать строку с \0 в конце:)

2 голосов
/ 25 марта 2020

Если формат всегда такой, то это также может работать

#include <stdio.h>

int main()
{
    char *str[] = {"a5 d8", "fe55 eec2", "a5 abc111"};
    int num1, num2;

    for (int i = 0; i < 3; i++) {
      sscanf(str[i], "%*[^0-9]%d%*[^0-9]%d", &num1, &num2);
      printf("num1: %d, num2: %d\n", num1, num2);
    }
    return 0;
}

Вывод

num1: 5, num2: 8                                                                                                                                                                   
num1: 55, num2: 2                                                                                                                                                                  
num1: 5, num2: 111

%[^0-9] будет соответствовать любому не ди git символу. При добавлении *, например, %*[^0-9] означает, что данные должны быть прочитаны из строки, но проигнорированы.

...