2017-01-20 37 views
0

ここに私のコードです。私は、ある単語(短い文字列)が文(長い文字列)内で出現する回数を調べる必要があります。 サンプル入力: 猫がマットに座っていた サンプル出力:2 何らかの理由により、文字列比較機能が動作しておらず、出力がゼロになっています。彼らがコードをデバッグするために置かれているので、コード内のコメントを無視してください。[C code]の文章で特定の単語が何回出現するかを調べる方法は?

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

int main(){ 
    char word[50]; 
    gets(word); 
    int len = strlen(word); 
    //printf("%d",len); 
    char nword[len]; 
    char s[100]; 
    strcpy(nword,word); 
    puts(nword); 
    printf("\n"); 
    gets(s); 
    //printf("%d",strlen(s)); 
    char a[50][50]; 
    int i,j,k; 
    j = 0; 
    for(i=0;i<strlen(s);i++) 
    { 
     a[i][j] = s[i]; 
     printf("%c",a[i][j]); 
     if(s[i] == ' ') 
     { 
      j++; 
      printf("\n"); 
     } 
    } 
    printf("%d",j); 
    k = j; 
    //printf("\nk assigned\n"); 
    j = 0; 
    //printf("j equal to zero\n"); 
    int count = 0; 
    int temp = 0; 
    //printf("count initialized.\n"); 
    for(i=0;i<k;i++) 
    { 
     if(strcmp(a[i],nword) == 0) 
      count++; 
    } 
    printf("\n%d",count); 
    return 0; 
} 
+1

を開始するには、 'char型のnword [LEN]'変更char nword [len + 1]に変換します。 –

答えて

0

問題はaは、2次元配列であり、あなたが1 DIMENTIONとしてそれを参照することです。 Mabyでは、i = line、j = characterを表すために2次元配列を使います。この考え方を守らなければならない場合は、これを行う必要があります:

j=0; 
for(i=0;i<k;i++) 
{ 
    if(strcmp(a[i][j],nword) == 0) 
     count++; 
    j++; 
} 

しかし、半分に分割された単語を検出することは困難です。私はaを1つの次元配列として保存することをお勧めします。 s[i]の内容をシリアルにコピーし、ラインを区別したい場合は\r\nオペレータを使用してください。

0

私はあなたの2次元配列を間違って使うと思います。 a[0][j]は、s[i]の最初の単語にする必要があります。しかし、あなたがやっていることは私には意味がないa[i][0] = s[i]です。 a[i][j]は、i番目の文字列とj番目の意味 -

0

あなたの主な問題は、多くの理由

int i,j,k; 
j = 0; 
for(i=0;i<strlen(s);i++) 
{ 
    a[i][j] = s[i]; 
    printf("%c",a[i][j]); 
    if(s[i] == ' ') 
    { 
     j++; 
     printf("\n"); 
    } 
} 

は、まずあなたが後方にあなたのインデックスを持っているため、このループである

敬具あなたがそれを逆にしたい単語ごとにjをインクリメントしているので - a[j][i]

第2に、saへのインデックス作成の両方にiを使用することはできません。 2番目の文字列を作成するときに何が起こるかを考えてください。あなたの入力例では、iが4のときに2番目の単語が始まるので、最初の文字はa[1][4]=s[4]として保存され、a[1][0]a[1][3]は初期化されません。したがって、他の文字列のどこにあるのかを追跡するためには、3番目の変数を使用する必要があります。

スペースをヒットした場合、後で一致しないようにスペースに単語を追加したくない場合。ヌル終端文字を各文字列の末尾に追加する必要があります。そうしないと、文字列の終わりがわからないことがあります。

が一緒に上記を置くあなたにこのような何か与える:私は機能strtok()strcmp()を使用して、これを実装し

int i,j,k; 
k = j = 0; 
for(i=0;i<strlen(s);i++) 
{ 
    if(s[i] == ' ') 
    { 
     a[j][k] = '\0'; 
     j++; 
     k=0; 
     printf("\n"); 
    } 
    else 
    { 
     a[j][k] = s[i]; 
     printf("%c",a[j][k]); 
     k++; 
    } 
} 
a[j][k]='\0'; 
0

を:

int main(void) 
{ 
    char word[] = "the"; /* the word you want to count*/ 
    char sample[] = "the cat sat on the mat"; /* the string in which you want to count*/ 

    char delimiters[] = " ,;."; 
    int counter; 
    char* currentWordPtr; 

    /* tokenize the string */ 
    currentWordPtr = strtok(sample, delimiters); 

    while(currentWordPtr != NULL) 
    { 
     if(strcmp(word, currentWordPtr) == 0) 
     { 
      counter++; 
     } 
     /* get the next token (word) */    
     currentWordPtr = strtok(NULL, delimiters); 
    } 

    printf("Number of occurences of \"%s\" is %i\n", word, counter); 

    return 0; 
} 
関連する問題