Рекурсивно печатать массив, получая странный вывод
Я пытаюсь написать программу на C, которая принимает входные данные из файла.txt, сохраняет слова в массиве указателей на символы, усредняет длину слова и печатает любые слова, которые превышают среднюю длину. Сейчас я пытаюсь заставить работать функцию печати (print_array), я хочу сделать это рекурсивно. По какой-то причине функция печати распечатывает не все элементы массива, а только первый элемент и каждый раз удаляет первый символ. Что я здесь не так делаю? ура
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ARRAYLEN 100
#define CHARLEN 79
void *emalloc(size_t s) {
void *result = malloc(s);
if (NULL == result) {
fprintf(stderr, "Memory allocation failed!\n");
exit(EXIT_FAILURE);
}
return result;
}
void print_array(char *a, int n) {
if (n > 0) {
printf("%s\n", &a[0]);
print_array(a + 1, n - 1);
}
}
int main(void) {
char word[CHARLEN];
char *wordlist[ARRAYLEN];
double average;
int num_words;
num_words = 0;
average = 0.0;
while (num_words < ARRAYLEN && 1 == scanf("%79s", word)) {
wordlist[num_words] = emalloc((strlen(word) + 1) * sizeof wordlist[0][0]);
strcpy(wordlist[num_words], word);
average += strlen(word);
num_words++;
}
average = average / num_words;
printf("Average is %.2f\n", average);
print_array(*wordlist, num_words);
return EXIT_SUCCESS;
}
Выход -
Average is 9.71
hello
ello
llo
lo
o
2 ответа
Аргумент *wordlist
указатель на первый элемент *wordlist[]
, но вы хотите напечатать двумерный массив! Так что код должен выглядеть так:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print_char_array(char *words[], int len) {
if (len > 0) {
printf("%s\n", words[0]);
print_char_array(words + 1, len - 1);
}
}
int main (int args, char *argv[]) {
char *words[] = {
"hello", "print", "array", "recursively", "output"
};
print_char_array(words, 5);
return 0;
}
Мой английский плохой, надеюсь, код поможет вам!
char *wordlist[ARRAYLEN];
Здесь у нас есть массив C строк.
print_array(*wordlist, num_words);
Здесь мы обращаемся к указателю, получая первую строку C в массиве и передавая ее print_array
,
void print_array(char *a, int n) {
if (n > 0) {
printf("%s\n", &a[0]);
print_array(a + 1, n - 1);
}
}
Здесь мы берем одну строку C, и если n
не ноль, распечатай (&a[0]
указатель на первый элемент в массиве, который в конечном итоге будет таким же, как a
сам). Затем мы добавляем один к строковому указателю C, так что мы делаем то же самое, начиная со второго символа. И так далее.
РЕШЕНИЕ: Если вы хотите напечатать массив строк C, print_array
функция принимает весь массив, а не только отдельную строку, т.е. char **
скорее, чем char *
, Затем избавьтесь от &
в print_array
и *
в строке, которая вызывает print_array
,
РЕДАКТИРОВАТЬ: как указано @chux, ваш CHARLEN
тоже слишком маленький. Сделайте это 80 так, чтобы у ваших строк было место для 79 символов плюс необходимый нулевой терминатор.