2012-05-23 10 views
-1

나는 명령에서 입력 해야하는 프로그램을 작성하고 다음 입력의 단어 빈도를 찾습니다. 문자열 (char 배열)을 strcmp() 함수를 사용하여 비교하는 데 문제가 있습니다. 나는 몇 시간 동안 그 일을 해왔지만 아직도 내가 잘못하고있는 것을 이해하지 못한다. 포인터와 관련이 있습니까? 여기 내 내 코드 : 당신은 여기 세그멘트 폴트를 요구하고C에서 strcmp() 함수를 사용하여

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

int main(){ 
    char Words[501][21]; 
    int FreqNumbers[500]; 
    char temp[21] = "zzzzz"; 
    char Frequency[5][21]; 
    int wordCount = 0; 
    int numberCount = 0; 
    int i = 0; 
    int counter = 0; 
    int end = 0; 

    do { 
     scanf("%20s",Words[wordCount]); 
     for(counter = 0;counter < wordCount;counter++){ 
      if(wordCount > 0){ 
       if(strcmp(Words[wordCount], Words[counter]) == 0){ 
        FreqNumbers[counter]++; 
        break; 
       } 
       FreqNumbers[wordCount]++; 
      } 
     } 
     wordCount++; 
     printf("%s", Words[wordCount - 1]); 
     printf("%s", temp); 
    } while(strcmp(Words[wordCount],&temp) != 0); 

    return(0); 
} 
+4

문제가 무엇인지 알려주지 않았기 때문에 말하기 어렵습니다. –

+1

코드를 디버깅해야한다고 말하고 싶습니다. 예를 들어, 초기화되지 않은 값은 어떻게됩니까?'FreqNumbers'에서 각 항목의 초기 값은 무엇입니까? –

+0

내가 가지고있는 문제는 while 루프가 끝나지 않는다는 것입니다. 심지어 5 개의 z를 입력해도 while 루프를 종료해야합니다. 그리고 가난한 코딩에 대해 유감스럽게 생각합니다. 저는 C를 처음 접했습니다. =/ –

답변

1

strcmp 기능은 사용자가 입력 한 단어를 "zzzzz"와 비교하는 대신 "zzzzz"로 배열의 다음 항목을 확인하고 있으므로 일치하지 않았으므로 종료되지 않았습니다. (당신은 strcmp 기능 전에 wordCount++;을 따라)

char temp[10]

- temp가 가리키는됩니다 10 개 문자의 배열입니다. (불변/상수).

strcmp 함수를 전달하면 변수 포인터가 메모리를 가리키는 변수의 주소가됩니다 (조금 혼란 스럽지만 사진을 얻을 수 있기를 바랍니다). 그래서 이상적으로 말해야한다.

strcmp(Words[wordCount],temp); 또는

strcmp(Words[wordCount],&temp[0]);은 어떤 비록 조금 혼란 스러울 수도있다. KnR을보고 특히 배열을 읽는 것이 좋습니다. array of chars

코드를 약간 변경했습니다. 지금 요구되는대로 작동 중입니다. 만족 스럽다면 답변에 표정과 표식이 있습니다.

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

int main(){ 

    char Words[501][21]={{0}};   //zero initialized 
    char *temp = "zzzzz";  //string literal 
    int FreqNumbers[500],wordCount = 0,counter = 0;  //other variables 

    do { 

     scanf("%s",Words[wordCount]); 

     for(counter = 0;counter < wordCount;counter++){ 

      if(wordCount > 0){ 
       if(strcmp(Words[wordCount], Words[counter]) == 0){ 
        FreqNumbers[counter]++; 
        break; 
       } 
       FreqNumbers[wordCount]++; 
      } 
     } 
     wordCount++; 
     printf("%s\n", Words[wordCount - 1]);   //print if required 
     printf("%s\n", temp);       //print if required 

    } while(strcmp(Words[wordCount-1],temp) != 0);  

    return(0); 
} 
+0

감사합니다. strncmp()를 사용하면 사용하기가 더 쉽습니다. 다시 귀하의 의견을 주셔서 감사합니다! –

0
do { 
    scanf("%20s",Words[wordCount]); 
    wordCount++; 

} while(strcmp(Words[wordCount],&temp) != 0); 

. 왜 do do loop에서 이것을하는 이유는 무엇입니까?

+0

사용자가 원하는만큼 단어를 입력 할 수 있으면 다른 방법으로 표시되지 않습니다. 사용자가 'zzzzz'를 입력 할 때까지 입력을 계속 요청해야합니다. –

+0

코드를 단계별로 실행하십시오. 'wordCount'는 당신이 생각하는대로되지 않을 것입니다. – Falmarri

1
while(strcmp(Words[wordCount],&temp) != 0); 

temp 이미 const를 char *이다. & 연산자를 사용하지 마십시오. 그러면 const char 포인터에 대한 포인터가 생깁니다.

관련 문제