Joh*_*ohn 0 c arrays recursion
程序查找给定输入中单词的平均长度,并打印大于平均值的单词.这是程序
#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;
}
Run Code Online (Sandbox Code Playgroud)
该程序一直运行到"numbers_greater"方法,给出了分段错误错误.我是C的新手,所以我有点困惑,递归方法在没有strlen语句的情况下运行时没有错误,但是使用strlen语句(即使我将它设置为静态数字,如2)它会炸出码.我是否错误地遍历了数组?
这条线
numbers_greater(wordlist+1, average, n+1);
将递增wordlist指针和整数n.你正在做什么,实际上是你要检查的值增加2而不是一个,就像你想要的那样.
要消除段错误,请将此行更改为以下内容:
numbers_greater(wordlist, average, n + 1);
请注意,使用简单的for循环可以更轻松地完成此操作.此外,我没有阅读其余的代码,可能还有一些我错过的错误,但这应该消除此功能中的分段错误.