我试图弄清楚如何计算用户输入的字符串中每个单词的出现次数。我想使用一个数组作为输入,并将每个元素/单词复制到另一个数组(单词),只有这个单词还没有被复制。如果它已被复制,我想通过使用并行计数器数组(计数)来增加出现次数。到目前为止,我已经编译了,但是当我运行程序时,它只给我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
}
答案 0 :(得分:0)
您应该使用字符串数组而不是words
的字符数组:
char *words[50];
您应该使用strdup()
分配单词的副本。
你的主循环不一致,你不匹配单词,你在字符串中查找每个偏移的字符串片段。将标记化代码移动到循环并匹配字符串,而不是字符。