2016-04-14 2 views
1

Я пытался вынуть отдельные цифры из входной строки, как 1 2 3 4,5 6 7 8,9 10 11 12 в программе c путем разделения с помощью strtok() функция. Для этого я написал ниже программирование, но он читал до первой запятой , разделитель (Примечание: размер ввода может варьироваться. Как в данном примере запятая после 4 цифр, но она может быть после k (5,6,7 и т. Д.) Цифр основанные на предоставлении тестовых ящиков).Невозможно разделить строку ввода из заданного формата в c?

fgets(str,80,stdin); 

/* read str with comma(,)delimiter */ 
token = strtok(str, ","); 

/* walk through other tokens */ 
    while(token != NULL) 
    { 

     // read token string with space delimiter 
     token2 = strtok(token, " "); 
     while(token2 != NULL) 
     { 
      printf("%s \n", token2);  
      token2 = strtok(NULL, " "); 
     } 

     token = strtok(NULL, ","); 
    } 
+0

Вы ничего не делаете с результатом некоторых вызовов 'strtok', и вы передаете неправильный аргумент указателя. Вы должны совершать повторные вызовы с указателем 'NULL', пока' strtok' сам не вернет 'NULL'. Кроме того, вы должны добавить '\ n' в строку разделителя, так как' fgets' сохраняет завершающую 'новую строку'. –

+0

Каков ожидаемый результат простой тестовой программы, которая обрабатывает введенный вход? Каждая цифра, каждый номер, каждая группа, их сумма? Неясно. –

ответ

0

strtok не возвратный - вы можете только разметить одну строку за один раз. Если вы хотите одновременно токенизировать несколько строк за раз, используйте вместо этого strtok_r. А еще лучше, ВСЕГДА использовать strtok_r в предпочтении к strtok, так как она никогда не менее способны:

char *inner, *outer; 
fgets(str,80,stdin); 

/* read str with comma(,)delimiter */ 
token = strtok_r(str, ",", &outer); 

/* walk through other tokens */ 
while(token != NULL) 
{ 

    // read token string with space delimiter 
    token2 = strtok_r(token, " ", &inner); 
    while(token2 != NULL) 
    { 
     printf("%s \n", token2);  
     token2 = strtok_r(NULL, " ", &inner); 
    } 

    token = strtok_r(NULL, ",", &outer); 
} 

Вы также можете исследовать strsep, а также.

0

Реализация strtok работ с последней строкой, которая была передана ему, что не NULL.

Следовательно, линия:

token = strtok(NULL, ","); 

не работает.

Если вы знаете точное количество токенов, вы можете использовать sscanf.

/* read str with comma(,)delimiter */ 
token = strtok(str, ","); 

/* walk through other tokens */ 
while(token != NULL) 
{ 
    int num1; 
    int num2; 
    int num3; 
    int num4; 

    if (sscanf(token, "%d %d %d %d", &num1, &num2, &num3, &num4) != 4) 
    { 
     // Problem. 
    } 
    else 
    { 
     // Use the numbers 
    } 

    token = strtok(NULL, ","); 
} 
+0

, если мы не знаем точное количество цифр в каждом токене, как использовать sscnaf для получения всех цифр? –

+0

@BalaKrishna, пожалуйста, ясно объясните, что вы подразумеваете под «итоговым вводом», редактируя вопрос, а не в комментариях. –