2013-10-22 2 views
0

파일 작업을 사용하여 C의 연결된 목록이 필요합니다. 나는 선을 구해서 구조사들에게 그걸로 나누고 싶다. 하지만 두 개의 문자열을 나눌 수 없습니다. 이 같은C에서 "fscanf"사용하기 두 문자열을 어떻게 분할 할 수 있습니까?

내 파일 :

1 # 엠레 # 도간
2 # 존 # 스미스
3 # 애슐리 # 토마스
등 ...

난에서 한 줄을 읽을 수 fscanf를 사용하여 파일.

fscanf(file,"%d#%s#%s",&number,name,surmane); 

그러나 결과는

수 : 1
이름 : 엠레 # 도간

이름과 성으로 이름이 # 요소 제거 및 분할 얻을 수있는 방법

;

+5

strtok()을 사용하여 입력 문자열 – Anand

+0

을 구문 분석하면 sscanf() 함수를 사용할 수도 있습니다. 자세한 예제는 http://www.tutorialspoint.com/c_standard_library/c_function_sscanf.htm –

답변

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

int main(void) { 

    FILE *fptr; 
    fptr = fopen("Input.txt", "r"); 

    int number; 
    char *name; 
    char *surname; 
    char line_data[1024]; 

    fgets(line_data, 1024, fptr); 

    number = atoi(strtok(line_data, "#")); 
    name = strtok(NULL, "#"); 
    surname = strtok(NULL, "#");  

    printf("%d %s %s", number, name, surname); 
} 

출력 :

1 Emre Dogan 

편집 : 정수하는 문자열에서 Coverted 변수 "번호".

+0

고마워요 @ 애너 ... 그럼이 "문자열"번호를 int로 변환 할 수 있습니다 .. –

+0

@ EmreDoğan'atoi'를 사용하십시오 http : //www.cplusplus.com/reference/cstdlib/atoi/ – Sadique

+0

그러나이 프로그램은 여전히 ​​성만과 성을 보여줍니다. 그리고 그것을 분할했습니다. 번호 : 1 Emre DOGAN 2 Emre GAN 3 Emre N 4 Emre DOGN 등. –

0

fgets()을 사용하여 전체 줄을 읽은 다음 해당 줄을 구문 분석하는 것이 좋습니다. 이것은 fscanf()을 직접 입력 스트림에 사용하면 더 강력합니다. fscanf()은 공백을 건너 뜁니다.

그래서, 당신은 할 수 :

char line[1024]; 

if(fgets(line, sizeof line, file) != NULL) 
{ 
    int age; 
    char name[256], surname[256]; 

    if(sscanf(line, "%d#%255[^#]#%255s", &age, name, surname) == 3) 
    { 
    printf("it seems %s %s is %d years old\n", name, surname, age); 
    } 
} 

이 구문 분석 된 문자열의 # 구분을 포함하여 피하기 위해 %[] 형식 지정자를 사용합니다. 나는 이것이 strtok()보다 깨끗하다고 ​​생각하는데, 이는 무서운 기능을 피하는 것이 가장 좋습니다.

관련 문제