如何计算字符串中每个单词的出现次数?

时间:2016-03-13 22:20:54

标签: c arrays string pointers

我试图弄清楚如何计算用户输入的字符串中每个单词的出现次数。我想使用一个数组作为输入,并将每个元素/单词复制到另一个数组(单词),只有这个单词还没有被复制。如果它已被复制,我想通过使用并行计数器数组(计数)来增加出现次数。到目前为止,我已经编译了,但是当我运行程序时,它只给我0表示所有计数值,并且它仍然打印字符串中的每个单词,即使它之前已经打印过。任何帮助将不胜感激!

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

#define STR_LEN 1000
int read_line(char *str, int n);

int main() {
    char input[STR_LEN + 1];
    char *token;
    char words[50];
    char *p1;
    char *p2;
    int i;
    int count[50] = { 1 };

    printf("Please enter a string: ");
    read_line(input, STR_LEN);   //Calls the readline function

    printf("Input: %s\n", input);
    for (i = 0; i < strlen(input); i++) {
        p1 = &input[i];
        p2 = &words[i];
        if (strstr(p1, input) == 0) {
            strcpy(p2, p1);
        } else
            count[i]++;     
    }
    printf("Output: \n");
    token = strtok(words, " ,.!");  //tokenizes the first word in the string

    while (token != NULL) {    
        printf("%s\t\t%d\n", token, count[i]);
        token = strtok(NULL, " ,.!");  //tokenizes subsequent words in the string
    } 
    return 0;
}

int read_line(char *s1, int n) {
    int ch, i = 0;

    while ((ch = getchar()) != '\n') {
        if (i < n) {
            *s1++ = ch;
            i++;
        }
    }
    *s1 = '\0';  //terminates string
    return i;    //number of characters stored
}

1 个答案:

答案 0 :(得分:0)

您应该使用字符串数组而不是words的字符数组:

char *words[50];

您应该使用strdup()分配单词的副本。

你的主循环不一致,你不匹配单词,你在字符串中查找每个偏移的字符串片段。将标记化代码移动到循环并匹配字符串,而不是字符。