我正在编写一个程序,其目标是找到出现X次或更多次的字符串。
我有一个单词列表,我的输入是给一个int值,让我们称之为X,然后程序找到在文件中出现X次或更多次的单词,然后,输出是多少个单词出现X或多次在文件中。 首先,我正在测试自己在cmd上写下单词的函数,它不起作用,我不知道为什么。该程序停止工作并关闭。
char *str_dup(const char *s){
char *result = (char *) malloc(strlen(s) + 1);
strcpy(result, s);
return result;
}
int str_readline(FILE *f, char *s){
int result = EOF;
char *p = fgets(s, INT_MAX, f);
if (p != NULL){
result = (int) strlen(s);
if (result > 0 && s[result-1] == '\n')
s[--result] = '\0';
}
return result;
}
int strings_read(FILE *f, char **a){
int result = 0;
char line[10000];
while(str_readline(f, line) !=EOF){
a[result++] = str_dup(line);
}
return result;
}
int strings_get(char **a){
return strings_read(stdin, a);
}
int howMany(char **a, int n, int x){
int result = 0;
int howMany = 0;
for(int i=0; i<n; i++){
if(strcmp(a[i], a[i+1]) == 0){
result++;
}
else if(strcmp(a[i], a[i+1]) > 0 || strcmp(a[i], a[i+1]) < 0){
result = 0;
}
if(result >= x){
howMany++;
}
}
return howMany;
}
void test_howMany(void){
char *a[1000];
int x;
scanf("%d", &x);
int n;
while((n = strings_get(a)) != 0){
int z = howMany(a, n, x);
printf("%d\n", z);
}
}
int main(void){
test_howMany();
return 0;
}
FIRST if表示字符串是否相等,然后向结果添加1值 SECOND一意味着如果它们不相等,结果变为0,这样它就可以再次开始查看我们有多少等于第三个意味着如果结果等于或高于X那么我们在howMany上还有1个值,这就是什么我希望在课程结束时。
有什么问题?
答案 0 :(得分:4)
这里有三个主要问题。
首先,您正在读取数组的末尾:
for(int i=0; i<n; i++){
if(strcmp(a[i], a[i+1]) == 0){
当i
的值为n-1
时,a[i+1]
实际上是a[n]
,这是超出数组末尾的一个元素。读取数组末尾会调用undefined behavior,这会导致崩溃。您需要将循环更改为n-1
:
for(int i=0; i<n-1; i++){
其次,您的算法仅比较此列表中的相邻单词。为了实现这一点,您的列表需要进行排序,而您的代码不会这样做。
第三,假设你对单词进行了排序,当你找到一个新单词时,你的计数器从0开始。因此,当您第一次找到一个单词时,计数为0,那么当您发现第二次出现时,计数为1,依此类推。当你找到一个新单词时,你需要从1开始result
。