2015-01-08 2 views
-3

은 내가 scanf("%s %s %s",&str1,&str2,&str3);으로 시도이같은 행에 여러 문자열을 읽는 방법은 무엇입니까?

string1 string2 string3 
string4 string5 string6 
string7 string8 string9 

처럼 보이는 파일에서 여러 문자열을 읽을 필요하지만, 모욕 또는 아무것도 나는 천국 때문에 '를 시작하지 않는 이상한 manner.Please에서 문자열을 읽어 이 일을하는 법을 배웠고 나를 위해 일하지 않는 것처럼 보입니다.

+2

그냥 str1과, str2'와'str4' '의 정의를 게시 :

내가 위의 코드 ("text.txt"로 저장되어 사용되는 텍스트 파일)를 컴파일 할 때 내가 무엇을 얻을 . –

+3

및 "이상한"명확히, 어쩌면 하나 이상의 예제를 보여주십시오. – fvu

+2

내가 당신을 모욕했다면, 당신이 제공 한 가난한 세부 사항 때문일 것입니다. 'str1'이란 무엇입니까? 그리고 지구에서 "이상한 태도"가 의미하는 것은 무엇입니까? 프로그래머가 문제를 해결하는 데 도움이되는 충분한 정보 나 정보를 제공하지 않았습니다. –

답변

1

C에서 줄을 읽는 가장 좋은 방법은 먼저 fgets()으로 읽은 다음 sscanf() 또는 strtok() 줄을 구문 분석하여 단어를 가져올 수 있습니다.

ho hello blah hi dsdf hihi hiho hih bleh 

다음은 내가 그것을 읽고 사용하십시오 코드입니다 :

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

int main(){ 
    char line[1024]; 
    char str1[1024], str2[1024], str3[1024]; 
    while (fgets(line, sizeof(line), stdin) != NULL){ 
     if (strlen(line) > 0 && line[strlen(line) - 1] != '\n') { 
      // or line[0] instead of strlen(line) > 0 
      // like chux suggested (line[0] is more efficient) 
      puts("The line is longer than expected"); 
      return 1; 
     } 
     if (sscanf(line, "%s %s %s", str1, str2, str3) != 3){ 
      // notice it wont fail if the input have more than 3 columns 
      puts("Error parsing, not enough columns"); 
      return 2; 
     } 
    } 
    return EXIT_SUCCESS; 
} 
+1

왜 downvote? 'fgets()'를 사용하는 방법을 배우는 것보다'scanf()'를 사용하여 올바르게 읽는 것이 더 어렵습니다. – Fernando

+0

fgets가 좋지 않습니다. – Jasen

+0

@Jasen 당신은 무엇을 의미합니까? 읽기 : http://stackoverflow.com/questions/2430303/disadvantages-of-scanf 또는 http://stackoverflow.com/questions/2565727/what-are-the-c-functions-from-the-standard-library- 피할 수없는 것 – Fernando

1

나는 텍스트 파일이 있습니다. 그래서 스트림() C. scanf로의 입력/출력에 사용되는 기본 입력 스트림 (표준 입력)를 사용하고있다 일명

#include <stdio.h> 

int main() 
{ 
    char string1[11]; 
    char string2[11]; 
    char string3[11]; 
    char string4[11]; 
    char string5[11]; 
    char string6[11]; 
    char string7[11]; 
    char string8[11]; 
    char string9[11]; 

    FILE * fileReader = fopen("text.txt", "r"); 
    if(fileReader) 
    { 
     fscanf(fileReader, "%10s %10s %10s %10s %10s %10s %10s %10s %10s", string1, string2, string3, string4, string5, string6, string7, string8, string9); 
     printf("Found: %s %s %s %s %s %s %s %s %s\n", string1, string2, string3, string4, string5, string6, string7, string8, string9); 
     fclose(fileReader); 
    } 
    else 
    { 
     puts("Error opening filestream!"); 
    } 
return 0; 
} 

FILE *를, 파일을 읽기 위해 사용될 수 없다. fscanf()를 사용하면 파일 스트림을 매개 변수로 지정할 수 있습니다.

또한 % 10s를 사용하면 fscanf()가 각 문자열에 대해 10자를 초과하여 읽지 않습니다. % 10s가 없으면 scanf()로 인해 프로그램의 버퍼 오버플로가 발생할 수 있습니다. 이것은 기본적으로 char [] 변수가 보유 할 수있는 것보다 많은 데이터를 읽는 경우 프로그램 메모리를 손상시킵니다.

(fileReader)가 fileReader가 성공적으로 열렸는지 확인합니다 (0이 아닌 값 = true, 0 (일명 NULL) = false). 나는 마치 (fileReader! = NULL)처럼 할 수 있었지만 같은 효과가 있었다.

또한 배열을 처리 할 때는 & 연산자를 사용하지 마십시오. 배열은 scanf()와 같은 함수에 전달 될 때 포인터가 열화되므로 &을 사용하면 포인터의 주소를 scanf()로 전달합니다. 이는 원하는 포인터가 아닙니다.

[email protected]:~$ gcc stringReader.c -o string && ./string 
Found: ho hello blah hi dsdf hihi hiho hih bleh 
관련 문제