2014-04-08 1 views
0

구문 내 특정 문자의 빈도를 계산하는 C 프로그램을 작성하려고합니다. 이 프로그램은 (문자를 배열에 저장하는 mmap을 통해) 문자로 구를 읽고 현재 문자를 원하는 문자와 비교합니다. 일치하는 항목이 있으면 카운터가 증가합니다. 그러나 코드를 실행할 때 이상한 결과가 발생합니다. 디버그에서 일치하더라도 문자가 strcmp에 대한 호출에서 일치하지 않기 때문에 주파수가 증가하지 않습니다. 이 문제를 일으키는 내 프로그램 내에서 어떤 일이 일어나고 있습니까?C - strcmp()가 제대로 작동하지 않습니다.

char* data;   /* input contents from mmap */ 
    char* currChar;  /* character being compared to */ 
    char inChar;  /* character being read */ 

    ... 

    do { 
     /* get character */ 
     inChar = 0; 
     inChar = data[i]; 

     /* debug */ 
     printf("data[i] = %c, inChar = %c, &inChar = %c, currChar = %s\n", 
       data[i],  inChar,  &inChar,  currChar); 

     /* if match */ 
     if (strcmp(&inChar, currChar) == 0) { 
      /* increment frequency */ 
      freq++; 
     } 

     /* increment position */ 
     i++; 
    } while (inChar != 0); 

다음은 "and"단어에서 'a'의 빈도를 계산할 때 출력되는 샘플입니다.

data[j] = a, inChar = a, &inChar = S, currChar = a 
data[j] = n, inChar = n, &inChar = S, currChar = a 
data[j] = d, inChar = d, &inChar = S, currChar = a 
0 instances of a 
+1

방금 ​​대신'inChar == * currChar'을 확인 봤어

단지로 STRCMP 기능을 제거? – Baldrick

+0

currChar가 시작되지 않았습니다. 문자를 비교하려면 '=='연산자 만 사용하십시오. –

+0

일부 도구가 올바르게 작동하지 않는다는 제목을 볼 때마다 포스터가 초보자이며 도구가 잘못 사용되고 있다는 확률은 99.9 %입니다. 왜 문자 비교 함수를 사용하여 개별 문자를 비교하려고합니까? –

답변

2

strcmp 문자열을 비교한다. &inChar은 문자열이 아닙니다.

당신이 당신의 작업을 설명했습니다, 당신은

if (inChar == *currChar) 
1

strcmp는 '\ 0'로 끝나는 문자열을 기대와 비교를 할 수 있습니다. inChar은 단순히 문자 일 뿐이며 스택의 일부 값은 알 수없는 값입니다. 방금 문자를 비교하기 위하여려고하는 경우에

은하지 if (inChar == *currChar)

1

을 strcmp()가 왜 제로 종료 문자열을 비교합니다. 당신은 문자열을 비교하지 않습니다. 당신은 두 개의 개별적인 문자 값의 가치를 비교하고 있습니다. 여기 Reference은 다음과 같습니다.

"이 함수는 각 문자열의 첫 문자를 비교하기 시작합니다. 서로 동일하면 문자가 다를 때까지 또는 종료 null 문자에 도달 할 때까지 다음 쌍으로 계속됩니다 . " 이 시도

if (inChar == *currChar) ... 
0

:

for(j=0;currChar[j]!='\0;j++) 
{ 
    for(i=0;data[i]!='\0';++i) 
    { 
     if(currChar[j]==data[i]) 
      ++freq; 
    } 
    printf("Frequency of %c = %d", currChar[j], freq); 
} 
관련 문제