2013-11-01 2 views
8

Моя строка является «A, B, C, D, E»
И разделитель «»
Как я могу получить остальные строки после выполнения strtok() один раз, то есть "B, C, D, E"C: Как получить оставшуюся строку после использования strtok() один раз

char a[] = "A,B,C,D,E"; 
char * separator = ","; 
char * b = strtok(a,separator); 
printf("a: %s\n", a); 
printf("b: %s\n", b); 

выход:
а:
B:

Но как получить результат
a: B, C, D, E
b: A

Спасибо.

+0

Не думаю, 'strtok()' делает это. – Rohan

ответ

7

Не используйте для этого strtok(), так как это не то, для чего оно предназначено.

Использование strchr() найти первый разделитель, и идти оттуда:

char a[] = "A,B,C,D,E"; 
const char separator = ','; 
char * const sep_at = strchr(a, separator); 
if(sep_at != NULL) 
{ 
    *sep_at = '\0'; /* overwrite first separator, creating two strings. */ 
    printf("first part: '%s'\nsecond part: '%s'\n", a, sep_at + 1); 
} 
+0

Очень быстрое решение! –

1

Попробуйте это:

char a[] = "A,B,C,D,E"; 
char * end_of_a = a + strlen(a); /* Memorise the end of s. */ 
char * separator = ","; 
char * b = strtok(a, separator); 
printf("a: %s\n", a); 
printf("b: %s\n", b); 

/* There might be some more tokenising here, assigning its result to b. */ 

if (NULL != b) 
{ 
    b = strtok(NULL, separator); 
} 

if (NULL != b) 
{ /* Get reference to and print remainder: */ 
    char * end_of_b = b + strlen(b); 

    if (end_of_b != end_of_a) /* Test whether there really needs to be something, 
         will say tokenising did not already reached the end of a, 
         which however is not the case for this example. */ 
    { 
    char * remainder = end_of_b + 1; 
    printf("remainder: `%s`\n", remainder); 
    } 
} 
0

При использовании strtok не является обязательным требованием, вы можете использовать strchr вместо с сепаратором представляет собой один символ:

char a[] = "A,B,C,D,E"; 
char *sep = strchr(a, ','); 
*sep = '\0'; 
puts(a); 
puts(sep + 1); 
0

printf ("a:% s \ n", a + 1 + strlen (b));

Попробуйте

+0

Пожалуйста, см. * Larsmans * комментарии к * dasblinkenlight * ответ на этот подход. Это также относится к вашему ответу. – alk

0

strtok запоминает последнюю строку он работал с и где она закончилась. Чтобы получить следующую строку, вызовите ее снова с NULL в качестве первого аргумента.

char a[] = "A,B,C,D,E"; 
const char *separator = ","; 
char *b = strtok(a, separator); 
while (b) { 
    printf("element: %s\n", b); 
    b = strtok(NULL, separator); 
} 

Примечание: это небезопасный поток.

15

Вы можете изменять набор разделителей, так просто передать пустую строку:

char a[] = "A,B,C,D,E"; 
char * separator = ","; 
char * b = strtok(a, separator); 
printf("b: %s\n", b); 
char * c = strtok(NULL, ""); 
printf("c: %s\n", c); 
+1

** Пропуск без разделителя - это путь! ** В моем случае я использовал 'strtok' более одного раза, и в какой-то момент мне понадобился остаток. Так что ** не ** использование 'strtok' не было решением. Не суммируя символы, потому что я был «toking» в пространстве, и он мог содержать переменное количество последовательных пробелов и т. Д. – Paschalis

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