2016-10-01 2 views
-2

기본적으로 텍스트 파일의 미분 방정식을 읽은 다음 아포스트로피 (''는 첫 번째 주문)로 분류합니다 (''는 두 번째 순서) 다음 첫 번째 또는 두 번째 경우 인쇄 할 수 배열에 각 방정식을 저장합니다. 그것은 오류가 없다고하지만 컴파일러를 실행할 때 컴파일러가 충돌합니다. 내가 뭘 잘못 했니?C 프로그래밍 : 텍스트 파일의 배열에 문자열 저장 및 분류

#include <stdio.h> 
main() 
{ 
    FILE *fin; 
    int i; 
    char line[300]; 
    int value = 0; 
    fin = fopen("DIFFERNTIAL_EQNS.txt", "r"); 
    while(fgets(line, sizeof line, fin) != EOF) 
    { 
     for (i = 0; i < 300; i++) 
     if (line[i] == ('\'')) 
     { 
      if (line[i++] == ('\'')) 
      { 
       value = 2; 
      } 
      value = 1; 
     } 
    } 

    if (value == 1) 
     printf("this is 1st order\n"); 
    else 
     printf("this is 2nd order\n"); 

    fclose(fin); 
} 
+3

_i는 오류가 없다하지만 난 그것을 실행할 때, 내 컴파일러 crashes._ ...... o.O ... – LPs

+0

우선 다음'fopen' 반환 값을 확인합니다. 실패 할 수 있습니다. – LPs

+1

@LPs 아이디어/용어의 흥미로운 혼란 나는 추측한다.^나는 OP가 디버거를 사용하여 정확히 어떤 라인이 충돌을 일으키는 지 알 것이다. – UnholySheep

답변

1

코드는 몇 가지 문제가 있습니다

while(fgets(line, sizeof line, fin) != EOF) 

fgets

EOF를 반환하지 않습니다

내가이 줄 문제라고 생각합니다. 완료되면 (또는 오류 발생시) NULL을 리턴합니다.

그래서 시도 :

while(fgets(line, sizeof line, fin) != NULL) 

또는 그냥

while(fgets(line, sizeof line, fin)) 

는 또한,이 라인은 나쁜 :

for (i = 0; i < 300; i++) 

당신은 fgets 전체 라인 어레이를 작성 것을 확신 할 수 없다 . 대신 다음을 수행하십시오.

for (i = 0; line[i]; i++) // or for (i = 0; line[i] != '\0'; i++) 

그래서 제로 - 종결까지만 계속하십시오.

당신은 여기에 버그가 있습니다

if (line[i] == ('\'')) 
    { 
     if (line[i++] == ('\'')) <---- use +1 instead 
     { 
      value = 2; 
     } 
     value = 1; // <------ You always overwrite with 1 so you never get 2 
    } 

가 대신 수행

if (line[i] == ('\'')) 
    { 
     value = 1; 
     if (line[i+1] == ('\'')) 
     { 
      value = 2; 
     } 
    } 

또한 당신이 단지 각 루프에 value을 덮어로 코드 한 줄을 처리 할 수있는 것 같다. 루프 내부에 인쇄물을 넣고 싶을 수도 있습니다. 마찬가지로 : -

while(fgets(line, sizeof line, fin)) 
{ 
    for (i = 0; line[i]; i++) 
     if (line[i] == ('\'')) 
     { 
      value = 1; 
      if (line[i+1] == ('\'')) 
      { 
       value = 2; 
      } 
     } 

    // Print the result for this line before reading next line 
    if (value == 1) 
     printf("this is 1st order\n"); 
    else if (value == 2) 
     printf("this is 2nd order\n"); 
    else 
     printf("Didn't find anything\n"); 

    value = 0; 
} 


fclose(fin); 

그리고 또 다른 문제는 입력을 고려 :

X ''+ 배 '+ X

위의 코드는 1 차라고합니다 3x' 때문에 "덮어 쓰기"값을 1로 변경하십시오. 따라서 2에서 1로 돌아 가지 않도록해야합니다. 어쩌면 좋아 :

if (line[i] == ('\'')) 
    { 
     if (value == 0) value = 1; // Changed this 
     if (line[i+1] == ('\'')) 
     { 
      value = 2; 
     } 
    } 
+0

와우 나는 당신이 나를 도왔을 때 정말 고맙습니다. 확실히 도움이되었다고 믿어. 나는 당신이 다른 것을 의미한다고 가정한다. (값 == 2) printf ("this is 2nd order \ n"); == 1 대신. 따옴표 오류가 발생하지 않고 2 행을 인쇄하는 방법을 알고 계십니까? 예 : if (line [i + 1] == ('\' '')) 또는해야 할 것 ('\'\ '') –

+0

올바른 -'value == 2' :-) 복사 - 붙여 넣기하지 않고 붙여 넣기 .... 주석의 질문에 대해서 : 그냥 사용할 수 없습니까?'printf ("\ '\'\ n");'?그것은 나를 위해 일합니다. 하지만 아마도 당신은 인쇄에 대해 말하는 것이 아닙니다 ...? – 4386427

+0

오, 그래, 좋아. 그래서이 코드에는 완전히 옳지 않은 무언가가 있습니다. 내가하려고하는 것은 모든 행을 살펴보고 첫 번째 또는 두 번째 순서인지 확인한 다음 값을 할당하는 것입니다. 여기서 I는 당장 시도 어떻게 \t '동안 (핀는 fgets (선는 sizeof 라인))에 대한 \t { \t \t (I = 0; 라인 [I]가, 난 ++) \t \t \t 경우 (라인 [I ] == ('\' '&&'\ '\' ')) \t \t \t \t 값 = 2; \t \t \t else \t \t \t \t 값 = 1; (line [i + 1] == ('\' ')) \t \t \t}' –

0

fopen이 파일을 찾는 것이 거의 확실하기 때문에 충돌이 발생합니다. 디버거를 통해 실행하는 경우 시작 또는 홈 디렉토리가 생각하는 것과 다를 수 있습니다. 그러나 버그도 있습니다. 일반적으로 for 루프를 사용하면 루프 본문 내에서 카운터를 증가 시키면 안됩니다. 또한 line [i] == 0에서 중단해야합니다. 그렇지 않으면 문자열 끝 뒤에서 임의의 가비지를 읽습니다.

+0

실제로 문제가되었지만 필자가이 프로그램을 실행할 때 컴파일러는 텍스트가 전혀없는 검은 색 피치입니다. 이 코드를 올바르게 코딩했는지 확실하지 않습니다. –

+0

출력을 확인하려면 "hello"를 출력하십시오. 그런 다음 파일의 각 행과 "value"와 같은 다른 진단 정보를 인쇄하십시오. –

0

fgets()은 다른 입력 함수처럼 문자를 반환하지 않고 성공시 문자열 포인터를 반환하거나 NULL입니다. NULLEOF과 매우 다른 것입니다! 이와 같이, EOF과의 비교는 항상 false가되므로 while() 루프를 남겨 둘 수 없습니다. (프로그램이 멈추는 것 같습니다).

NULLfgets()의 결과를 비교,이 문제를 해결하거나 NULL 같은

while(fgets(line, sizeof line, fin)) { 

항상 false 값으로 해석됩니다 쓰기합니다.


는 Btw는 :

  • 당신은 종료 제로 바이트를 확인하기 위해 실패에 의해 fgets()에 의해 반환되는 라인 문자열을 오버런 : 나는 당신의 프로그램에서 세 가지 이상의 오류를 참조하십시오. 이것은 쉽게 문자열의 잘못된 분류로 이어질 수 있습니다.

  • 임의로 긴 줄을 허용하지 않습니다. 내가 너라면, fgets() 대신에 getline()을 사용할 것입니다. 자동으로 버퍼를 할당하여 길이에 관계없이 입력을 올바르게 처리 할 수있게합니다.

  • i++을 사용하여 이후에 값을 증가시킵니다. 따라서 두 개의 if(line[...] == ('\'')) 문은 동일한 문자를 검사하기 때문에 두 가지 또는 모두 실행되지 않습니다.

관련 문제