数相似的词

时间:2016-03-12 01:13:14

标签: c arrays string

我遇到了这个程序的问题,我希望它只在输入中显示一次单词并在每次出现时计数,但它会显示输入的每个单词。

例如,如果我输入

  

"这应该只出现一次"

然后我希望程序输出

this 1 
should 1 
only 2 
appear 2 
once 1

任何帮助将不胜感激。

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

#define ROW 1000
#define COL 50

int read_input(char *str, int n);

int main(void)
{
    char str[ROW];
    char stringSeperate[ROW][COL] = { };
    const char *s= " ,.!";  

    char *p;
    int freq[ROW];
    int i = 0;
    int wordCount = 0;
    int pos = 0;

    read_input(str, ROW);

    p = strtok(str,s);
    i = 1;

    while(p !=NULL) {
        wordCount = i;
        for(i = 0; i < wordCount; i++) {
             if (strcmp(p, stringSeperate[i]) != 0) 
                pos = 1;
            else
                pos = i;
        }
        if (pos == 1) {
            strcpy(stringSeperate[i], p);           
            freq[i++]++;

        }
        else
            freq[pos]++;
        p = strtok(NULL,s);
    }

    for ( i = 1; i <= wordCount; i++ ) {
        printf("Word: %s\t Number: %d\n",stringSeperate[i], freq[i]);
    }

    return 0;
}

int read_input(char *str, int n) 
{
    int ch, i = 0;

    while((ch = getchar()) != '\n') {
        if ( i < n ) {
            *str++ = ch;
            i++;
        }
    }
    *str = '\0';
    return i;
}

1 个答案:

答案 0 :(得分:1)

您使用具有自动存储持续时间的未初始化变量freq的值来调用未定义行为,这是不确定的。

将其初始化为int freq[ROW] = {0};

你也应该

1。将stringSeperate的初始化更改为标准:不允许使用空的initlalizer,因此它应该像

char stringSeperate[ROW][COL] = {{0}};

2。删除额外的打印以匹配所需的输出:更改

printf("Word: %s\t Number: %d\n",stringSeperate[i], freq[i]);

printf("%s %d\n",stringSeperate[i], freq[i]);

3。检查输入长度,以免导致缓冲区溢出。变化

if ( i < n ) {

read_input

if ( i < n - 1 ) {

为终止null-characteer腾出空间。