如何在句子[C代码]中找到给定单词出现的次数?

时间:2017-01-20 09:39:07

标签: c

这是我的代码。我需要找出句子中出现给定单词(短字符串)的次数(长字符串)。 样本输入:               那只猫坐在垫子上 样本输出:2 由于某种原因,字符串比较功能不起作用,我的输出为零。请忽略代码中的注释,因为它们已用于调试代码。

#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;
}

4 个答案:

答案 0 :(得分:1)

你的主要问题是这个循环有多种原因

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");
    }
}

首先,你的索引是向后的 - a[i][j]表示第i个字符串和第j个字符,但是因为你为每个单词递增j你想要反过来 - a[j][i]

其次,您无法使用isa编入索引。想想在构建第二个字符串时会发生什么。在您的示例输入中,当i为4时,第二个单词开始,因此第一个字符将存储为a[1][4]=s[4]a[1][0]a[1][3]保留为未初始化。因此,您必须使用第三个变量来跟踪您在另一个字符串中的位置。

当你点击某个空格时,你不想将它添加到你的单词中,因为它以后不会匹配。您还需要在每个字符串的末尾添加一个null-terminator字符,否则您的代码将无法知道字符串结尾的位置。

将上述内容放在一起可以得到如下内容:

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';

答案 1 :(得分:0)

问题是a是一个二维数组,你将它作为一个维度引用。 Maby你使用2维数组来表示i = line,j = character。如果你保持这个想法,那么你必须这样做:

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

然而,很难发现分成两半的单词。我建议将a保留为一维数组。按顺序复制s[i]的内容,如果要区分行,请使用\r\n运算符。

答案 2 :(得分:0)

我认为您使用的二维数组错了。 a[0][j]应该是s[i]中的第一个单词。但你所做的是a[i][0] = s[i]这对我来说毫无意义。

祝你好运

答案 3 :(得分:0)

我会使用函数strtok()strcmp()

来实现这一点
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;
}