2015-10-01 2 views
0

Мне было интересно, как извлечь различные цифры из строки. Я понимаю, что strtol работает, однако, похоже, он работает только для первой цифры.Как извлечь различные целые числа из строки в C?

Вот мой код

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

int main(){ 
    long v1, v2, v3; 
    char str[20] = "16,23"; 
    char *d; 
    v1 = strtol(str, &d, 10); 
    v2 = strtol(str, &d, 10); 
    printf("string is %s\nv1 is:%i\nv2 is:%d\n",str , v1,v2); 
    return 0; 
} 

В этом примере я хотел бы выход v1 = 16 и v2 = 23.

Другой пример, если ул был "12,23,34", Я хотел бы v3 = 34

заранее спасибо :)

+0

Все ли целые числа разделены запятой? – Gangadhar

+0

Это называется *** tokenizing *** строка. Если вы ищете 'tokenize c', вы получите много полезных результатов. Вот связанный с этим вопрос здесь о SO. http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c – Dan

+1

Да, целые числа разделены запятой –

ответ

2

Вы можете иметь много подходов. Один из них - использовать endptr, заполненный предыдущим вызовом strtol() в качестве источника следующего strtol().

В противном случае, для лучшего и более гибкого подхода, вы также имеете возможность использовать strtok() с заданным разделителем (, здесь), чтобы получить жетоны один на один и конвертировать их в int или long (как вы хотите) до тех пор, strtok() возвращает NULL.

1

strtol просто преобразует массив символов в длинный int. Он останавливается, когда находит первый символ, который не имеет смысла интерпретировать целое число.

Существует функция в string.h с именем strtok, которая помогает вам токенизировать строку.

Опасайтесь, чтобы strtok мутировал исходное содержание массива символов.

2

Использование long strtol(const char * nptr, char ** endptr, int base). endptr позволяет упростить последующий синтаксический разбор, поскольку в этом случае синтаксический анализ остановлен.

#include <errno.h> 
#include <stdlib.h> 
#include <stdio.h> 

int string_to_longs(const char *s) { 
    #define N 3 
    long v[N]; 
    int i; 
    for (i=0; i<N; i++) { 
    errno = 0; 
    char *end; 
    v[i] = strtol(s, &end, 10); 

    if (errno) return -1; // overflow 
    if (s == end) return -1; // no conversion 
    printf("v[%d] = %ld\n", i, v[i]); 
    if (*end == 0) break; // we are done 
    if (*end != ',') return -1; // missing comma 
    s = (const char *) (end + 1); 
    } 
    return i; 
} 

int main(void) { 
    string_to_longs("16,23"); 
    string_to_longs("12,23,34"); 
    return 0; 
}