2017-01-09 2 views
0

У меня есть файл, который я хочу читать в с, формат файла выглядит следующим образом:Как работает strtok?

<city> <pokemon1> <pokemon2>; <near_city1> <near_city2> 

, например: paris pidgey pikachu; london berlin Я хочу, чтобы иметь возможность сократить эту строку на лексемы с помощью strtok, но по какой-то причине он не работает должным образом.

Мой код: скажем, что эта строка читается из файла с помощью fgets и помещается в char * row. так что я сделал:

char* city_name = strtok(location_temp, " "); // to receive city 
char* pokemons_names = strtok(strtok(location_temp, " "),";"); 

Хотя этот код вызывает ошибку сегментации позже, поэтому я последовал отладчик и заметил, что вторая строка коды не выполняются должным образом.

Помощь?

+0

Прочитайте документацию о функции. –

+1

[Может помочь эта ссылка 'strtok'] (http://en.cppreference.com/w/c/string/byte/strtok)? –

+0

Что конкретно ** о документации, которую вы должны прочитать, неясно? То, что вы нашли простым сыром, не помогло? – Olaf

ответ

3

Эти заявления

char* city_name = strtok(location_temp, " "); // to receive city 
char* pokemons_names = strtok(strtok(location_temp, " "), ";"); 

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

Однако этот фрагмент кода не делает то, что вы ожидаете. Первый и второй операторы возвращают тот же указатель, который является адресом начального слова в строке, на которую указывает location_temp.

Вы должны написать по крайней мере, как

char* city_name = strtok(location_temp, " "); // to receive city 
strtok(NULL, " "); 
char* pokemons_names = strtok(NULL, ";"); 

Я думаю, что ошибка сегментации происходит потому, что вы не копировать приведенные строки в отдельных массивах символов. Но без вашего реального кода трудно точно назвать причину.

Перед использованием следует ознакомиться с описанием функции strtok.

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

1

Вы можете использовать strtok() как это, чтобы собрать информацию о каждой строке:

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

int main(void) { 
    char string[] = "paris pidgey pikachu; london berlin"; 

    char *city = strtok(string, " "); 
    printf("city: %s\n", city); 

    char *pokemon_names = strtok(NULL, ";"); 
    printf("pokemon names: %s\n", pokemon_names); 

    char *near_cities = strtok(NULL, "\n"); 
    memmove(near_cities, near_cities+1, strlen(near_cities)); /* removes space at start of string */ 
    printf("near cities: %s\n", near_cities); 

    return 0; 
} 

Выход:

city: paris 
pokemon names: pidgey pikachu 
near cities: london berlin 

Это действительно зависит от того, как вы храните эти строки.

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