2014-09-15 2 views
-1
#include<stdio.h> 
#include<string.h> 
int main(){ 
     char path[] = "/fs/lost+found"; 
     char* temp; 
     temp = strtok(path,"lost+found"); 
     while(temp != NULL){ 
       printf("\n %s \n",temp); 
       temp = strtok(path,"lost+found"); 
     } 
     return 0; 
} 

Я хотел извлечь строку, потерянную + найденную. Выше программа переходит в бесконечный цикл и печатает «/», который перед разделителем «потерял + нашли»ошибка сегментации с strtok

[корень @ RS] # ./a.out вина Сегментация

+1

Я не вижу вопроса, также, включите предупреждения компилятора, также, переписывая строки - это неопределенное поведение. – fuz

+1

Прочитайте документацию для strtok. После того как вы пройдете «путь» в первый раз, вы должны передать NULL при последующих вызовах, чтобы продолжить работу над той же строкой. – abelenky

ответ

0

Вы не можете изменить строковый литерал и strtok() изменят строку, над которой она работает.

1

Аргумент delim указывает набор символов, которые ограничивают токены в анализируемой строке.

2-й аргумент, который вы предоставили для strtok предоставляет набор разделителей для tokenizing данной строки, а не для извлечения конкретной строки

Использования strstr

temp = strstr(path,"lost+found"); 

Это возвращает указатель на подстроки вы ищете

3

Вы совершили две ошибки (как вы можете легко найти от here).

  1. strtok() принимает в качестве второго аргумента разделителем. В вашем случае этот разделитель не lost+found, но разумно /.

  2. внутри блока while первого параметр функции strtok должен быть NULL, чтобы функция продолжить сканирование, когда предыдущий успешный вызов функции закончился.

Наконец, вы должны использовать strcmp(), чтобы обнаружить, если обрабатывается маркер является строка, которую вы ищете.

Итак:

... 
while (temp != NULL) { 
    if (strcmp("lost+found", temp) == 0) 
     printf ("%s\n", temp); // found 

    temp = strtok (NULL, "/"); 
    } 
... // not found 
3

от человека 3 strtok:

символ * strtok (символ *, ул Const символ * DELIM);

Функция strtok() анализирует строку в последовательности токенов. На первый вызов strtok() строка, подлежащая анализу, должна быть , указанной на стр. В каждом последующем вызове, который должен анализировать одну и ту же строку , str должна быть NULL.

Fix:

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

int main(){ 
    char path[] = "/fs/lost+found"; 
    char* temp; 
    temp = strtok(path,"/"); 
        // ^^^ different delimiter 
    do { 
     printf("%s\n", temp); 
     temp = strtok(NULL, "/"); 
        // ^^^^ each subsequent call to strtok with NULL as 1st argument 
    } while (temp != NULL); 
    return 0; 
} 

Это выведет "фс" и "потерянные + нашли" маркеров. Вы можете добавить некоторую проверку того, имеет ли temp в настоящее время значение, которое вы ищете, и затем вы можете сохранить его в другой переменной.

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