2013-04-02 4 views
2

Существует строка с линией текста. Предположим:Найти int в строке (char *) в чистом виде c

char * line = "Foo|bar|Baz|23|25|27"; 

Мне нужно было бы найти номера.

Я думал о чем-то вроде этого:

  1. Если данный символ является числом, давайте положить его в массив временного полукокса. (buffer)
  2. Если следующий символ НЕ является числом, давайте сделаем буфер новым int.

Проблема в том, что ... как найти числа в такой строке?
(я не знаком с C99/ССАГПЗ, что много.)

Компилятор используется: GCC 4.3 (среда является Debian Linux стабильной.)

+0

"зЬгстр" мог бы сделать это, с переключателем. Если char равно числу, мы продолжим. Но я не уверен, что это лучший способ. (Имея собственную длинную функцию, просто чтобы проверить, является ли символ числом.) @squiguy - Я напишу короткий пример за секунду. – Shiki

+0

взгляните на isdigit(). –

+0

@ RandyHoward - И вот ответ. Большое спасибо. – Shiki

ответ

7

Я бы подойти как:

  • Учитывая '|' как разделитель, токенизировать строку текста, т. е. разделить строку на несколько полей.
  • Для каждого маркера:
    • Если маркер является числовым:
      • Преобразовать маркер ряда

Некоторые функции библиотеки, которые могут быть полезны strtok, isdigit , atoi.

2

Один из возможных вариантов реализации подхода, предложенного в this answer, на основе sscanf.

#include <stdio.h> 
#include <string.h> 

void find_integers(const char* p) { 
    size_t s = strlen(p)+1; 
    char buf[s]; 
    const char * p_end = p+s; 
    int n; 
    /* tokenize string */ 
    for (; p < p_end && sscanf(p, "%[^|]%n", &buf, &n); p += (n+1)) 
    { 
     int x; 
     /* try to parse an integer */ 
     if (sscanf(buf, "%d", &x)) { 
      printf("got int :) %d\n", x); 
     } 
     else { 
      printf("got str :(%s\n", buf); 
     } 
    } 
} 

int main() { 
    const char * line = "Foo|bar|Baz|23|25|27"; 
    find_integers(line); 
} 

Выход:

$ gcc test.c && ./a.out 
got str :(Foo 
got str :(bar 
got str :(Baz 
got int :) 23 
got int :) 25 
got int :) 27 
+0

Спасибо, еще один отличный ответ. – Shiki

Смежные вопросы