#include<stdio.h> #include<string.h> #define col 10 int i=0; //剪出一个单词,例如 how do you do,那么第一个sub就是how char *cut_word(char str[]) { char static sub[10]; int j; for(j = 0;str[i]!=' '&&str[i]!='\0';i++,j++) { sub[j]=str[i]; } i++; sub[j]='\0'; return sub; } void bubble_sort(char str[][col],int num[],int row) { int flag,i,j; for(i=1;i<row;i++) { flag = 0; for(j=0;j<row-i;j++) { if(stricmp(str[j],str[j+1])>0) { char t[10]; //数组元素互换 strcpy(t,str[j]); strcpy(str[j],str[j+1]); strcpy(str[j+1],t); int k; //单词个数交换 k=num[j]; num[j]=num[j+1]; num[j+1]=k; flag = 1; } } if (flag == 0) break; } } int main() { int key=0,num[100]={0},temp=1; char strstr[1000],*substr,newstr[100][10]; gets(strstr); substr=cut_word(strstr); strcpy(newstr[key],substr); num[key]++; key++; while(1) { substr=cut_word(strstr); //看是否和newstr中的行元素有相同的 for(int j=0;j<key;j++) { if(strcmp(substr,newstr[j])==0) { num[j]++; temp=0; break; } } //找到新的单词 if(temp) { strcpy(newstr[key],substr); num[key]++; key++; } if(strstr[i-1]=='\0') break; } //字符串大小比较字典排序 冒泡 bubble_sort(newstr,num, key); for(i=0;i<key;i++) printf("%-10s%d\n",newstr[i],num[i]); }这个代码统计单词个数,但是这个代码出现了问题,输入a b a c不能输出c的个数,你能帮我更改吗
时间: 2024-03-17 20:43:49 浏览: 73
可以的,问题出在cut_word函数中,每次调用时都是从0开始遍历字符串,而不是从上一次结束的位置开始。因此,需要在cut_word函数中增加一个参数,表示当前遍历到的位置,同时在主函数中调用cut_word函数时传入上一次遍历结束的位置。以下是更改后的代码:
```
#include<stdio.h>
#include<string.h>
#define col 10
char *cut_word(char str[], int *pos) {
char static sub[10];
int j = 0;
while (str[*pos] == ' ') {
(*pos)++;
}
while (str[*pos] != ' ' && str[*pos] != '\0') {
sub[j++] = str[(*pos)++];
}
sub[j] = '\0';
return sub;
}
void bubble_sort(char str[][col], int num[], int row) {
int flag, i, j;
for (i = 1; i < row; i++) {
flag = 0;
for (j = 0; j < row - i; j++) {
if (stricmp(str[j], str[j + 1]) > 0) {
char t[10];
//数组元素互换
strcpy(t, str[j]);
strcpy(str[j], str[j + 1]);
strcpy(str[j + 1], t);
int k;
//单词个数交换
k = num[j];
num[j] = num[j + 1];
num[j + 1] = k;
flag = 1;
}
}
if (flag == 0) break;
}
}
int main() {
int key = 0, num[100] = { 0 }, temp = 1, pos = 0;
char strstr[1000], *substr, newstr[100][10];
gets(strstr);
substr = cut_word(strstr, &pos);
strcpy(newstr[key], substr);
num[key]++;
key++;
while (1) {
substr = cut_word(strstr, &pos);
temp = 1;
//看是否和newstr中的行元素有相同的
for (int j = 0; j < key; j++) {
if (strcmp(substr, newstr[j]) == 0) {
num[j]++;
temp = 0;
break;
}
}
//找到新的单词
if (temp) {
strcpy(newstr[key], substr);
num[key]++;
key++;
}
if (strstr[pos] == '\0')
break;
}
//字符串大小比较字典排序 冒泡
bubble_sort(newstr, num, key);
for (int i = 0; i < key; i++)
printf("%-10s%d\n", newstr[i], num[i]);
return 0;
}
```
这个代码中,cut_word函数增加了一个pos参数,表示当前遍历到的位置。在主函数中,每次调用cut_word函数时传入pos的地址,以便在函数内部更新pos的值。同时,在调用cut_word函数前,需要先检查当前位置是否为空格,以避免出现重复的单词。
阅读全文