2013-03-29 5 views
-1
#include <stdio.h> 

int main (void) { 
FILE *fp; 
fp = fopen("test.txt", "r"); 

int char_counter, i, c; 
int word_length[12]; 

char_counter = 0; 
for (i = 0; i <= 12; i++) { 
    word_length[i] = 0; 
} 

while ((c = getc(fp)) != EOF) { 
    if (c == '\n' || c == '\t' || c == ' ') 
    { 
     word_length[char_counter] = word_length[char_counter] + 1; 
     char_counter = 0; 
    } 
    else { 
     ++char_counter; 
    } 
} 

for (i = 0; i <= 12; i++) { 
    printf("%d %d\n", i, word_length[i]); 
} 

return 0; 
} 

있는 test.txt :히스토그램

blahblahblah blahblah 어쩌구 저쩌구 BL BB

출력 :

0 0 
1 1 
2 1 
3 1 
4 1 
5 0 
6 0 
7 0 
8 1 
9 0 
10 0 
11 0 
12 -1 <-- ?? 

예상 출력이 같은 보이지만이 -1이 아닌 12 행에서 1이어야합니다. 나는 어떻게 내가 음수를 얻었는지 정말로 이해하지 못한다. 이 snippt에서

+0

KandR 운동 1-13/1-14를하고 있습니까? – Sam

+0

하하하, 네! – lche

+0

나는 운동 1-13을 게시했다. 원하는 경우 운동 1-14를 게시하십시오 – Sam

답변

2

코드

int word_length[12]; 

는 0 번호 목록에서 12 개 항목 ... 11

다음은 정의되지 않은 동작을 얻을 항목 12에 액세스하려고이 있다는 것을 의미한다.

+0

간단한 설명 주셔서 감사합니다! – lche

1

봐 :

int word_length[12]; 

char_counter = 0; 
for (i = 0; i <= 12; i++) { 
    word_length[i] = 0; 
} 

당신이 버그를 발견 했습니까? 힌트 : 번호 12과 교환 원 <=을 다시 확인하십시오.

+0

@ Magtheridon96 감사합니다. 대답을 수정합니다 –

+0

@ Magtheridon96 답변으로 게시하려고 시도 했습니까? 하하! 나는 경주에서 이겼다 –

+0

@ Magtheridon96 나는 그들이 매우 유용하다고 생각한다 : p –

0

귀하의 int word_length[12]; 일부 쓰레기 값을주고 그 그래서, 그래서, word_length[12]이 접근하지 않는 0 ~ 11입니다 최대 12 INT 번호를 저장할 수있는 것을 의미한다.

int word_length[13];해야하고 문제가 해결 될 것입니다.

+0

감사합니다. 나는 지금 나의 잘못을 이해한다. – lche

0

철도청 운동 1-3

 
#include 

#define TAB_STOP 8 
#define MAX_WORD_TABS 4 
#define MAX_WORD MAX_WORD_TABS * TAB_STOP 

int main() { 

    int c, i, is_first = 1, skip_space = 1, skip_tab = 0; 
    long word_c = 0, word_l = 0; 

    while ((c = getchar()) != EOF) { 
     if (c != ' ' && c != '\t' && c != '\n') { 
      word_l++; 
      skip_space = 0; 
      if (is_first) { 
       ++word_c; 
       is_first = 0; 
      } 
      putchar(c); 
     } else { 
      is_first = 0; 
      if (!skip_space) { 

       if (word_l 0; --word_l) 
        printf("|||||");     //putchar('|'); 

       putchar('\n'); 

       skip_space = 1; 
      } 
     } 
    } 
} 

당신은 입력과 프로그램의 출력 UNIX에 재 (<,> 또는 >>)를 사용할 수 있습니다 ... 파일 처리가 필요하지 않습니다.