程序查找给定输入中的单词的平均长度,并打印大于平均值的单词。这是程序
#define STRING_LEN 80
#define ARRAY_LEN 3
void *emalloc(size_t s) {
void *result = malloc(s);
if (NULL == result) {
fprintf(stderr, "Memory allocation failed!\n");
exit(EXIT_FAILURE);
}
return result;
}
void numbers_greater(char **wordlist, int average, int n){
if(n < ARRAY_LEN){
int a = strlen(wordlist[n]);
if(a>average){
printf("%s", wordlist[n]);
}
numbers_greater(wordlist+1, average, n+1);
}
}
int main(void) {
char word[STRING_LEN];
char *wordlist[ARRAY_LEN];
int num_words;
double average;
int i;
while (num_words < ARRAY_LEN && 1 == scanf("%79s", word)) {
wordlist[num_words] = emalloc((strlen(word) + 1) * sizeof wordlist[0][0]);
strcpy(wordlist[num_words], word);
num_words++;
}
average = 0.0;
for (i = 0; i < num_words; i++) {
average += strlen(wordlist[i]);
}
average = average / num_words;
printf("%f\n", average);
numbers_greater(wordlist, average, 0);
for (i = 0; i < num_words; i++) {
free(wordlist[i]);
}
return EXIT_SUCCESS;
}
程序一直运行到&#34; numbers_greater&#34;方法,给出分段错误错误。我是C的新手,所以我有点困惑,递归方法在没有strlen语句的情况下运行没有错误,但是使用strlen语句(即使我将它设置为静态数字,如2)它的炸弹超出代码。我是否错误地遍历了数组?
答案 0 :(得分:5)
这一行
numbers_greater(wordlist+1, average, n+1);
将递增wordlist
指针和整数n
。你正在做什么,实际上是你要检查的值增加2而不是一个,就像你想要的那样。
要消除段错误,请将此行更改为以下内容:
numbers_greater(wordlist, average, n + 1);
请注意,使用简单的for循环可以更轻松地完成此操作。此外,我没有阅读其余的代码,可能还有一些我错过的错误,但这应该消除此功能中的分段错误。
答案 1 :(得分:2)
让我们一起来看看
void numbers_greater(char **wordlist, int average, int n){
if(n < ARRAY_LEN){
int a = strlen(wordlist[n]);
if(a>average){
printf("%s", wordlist[n]);
}
numbers_greater(wordlist+1, average, n+1);
}
}
我有一个字符串数组,可以容纳3件事,我把n = 1.它第一次工作......但现在我们到了
numbers_greater(wordlist+1, average, n+1);
所以现在我们有一个字符串数组,由于wordlist+1
可以容纳2个字符串。现在n = 2,所以n < ARRAY_LEN
为真,但是wordlist[n]
将导致读取一个只能容纳2的数组中的第3个元素。
要修复此尝试
numbers_greater(wordlist, average, n+1);