2017-01-09 8 views
0

내가 전 C에서 읽고 싶은 파일이, 파일의 형식은 다음과 같다 내가 strtok를를 사용하여 토큰으로이 행을 절감 할 수 있도록하려면 paris pidgey pikachu; london berlin 하지만, 어떤 이유로 그것은 제대로 작동하지 않습니다.strtok은 어떻게 작동합니까? 예를 들어</p> <pre><code><city> <pokemon1> <pokemon2>; <near_city1> <near_city2> </code></pre> <p>:

내 코드 :이 행을 파일에서 읽어 fgets를 사용하여 char * 행에 넣을 수 있습니다. 이 코드는 나중에 세그먼트 오류를 ​​제공

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 
0123을

정말이 문자열을 저장하는 방법에 따라 다릅니다.