scanf("%i", &n); //number of strings being inputted
является неполным, поскольку scanf
(3) может завершиться ошибкой (например, если ваш пользователь вводит hello
). Вам нужно добавить дополнительный код, проверяющий успешность scanf
. Я предлагаю:
if (scanf("%i", &n) < 0) {
perror("number of strings expected");
exit(EXIT_FAILURE);
}
затем
char **s = calloc(n, 10 * (sizeof(char) + 1));
неправильно. Каждый элемент массива представляет собой char*
, который на большинстве машин имеет 4 или 8 байтов (sizeof(void*)
).
Так замените его на
char **s = calloc(n, sizeof(char*));
или с эквивалентом char**s = calloc(n, sizeof(*s));
, который, на мой взгляд, менее читаем.
Кроме того, calloc
может выйти из строя. Вам нужно добавить тест, например
if (s == NULL) {
perror("calloc of s");
exit(EXIT_FAILURE);
}
Внимательно прочитайте документацию каждой функции (например, calloc
, fgets
и т. д.), которую вы не написали в этой Ссылка на C.
Следующим шагом должен быть цикл, заполняющий каждый элемент s
. С другим calloc
или вызовом strdup
(3) если ваша система это позволяет. Конечно, этот calloc
(или strdup
) тоже может дать сбой, и вам нужно протестировать его на предмет сбоя.
Вы также можете использовать getline
(3) (или даже < a href="https://man7.org/linux/man-pages/man3/readline.3.html" rel="nofollow noreferrer">readline
(3)), если он есть в вашей системе. Уточните у своего менеджера, разрешено ли вам использовать их по закону и техническим причинам.
Если ваш компилятор GCC, вызовите его со всеми предупреждениями и отладочной информацией: gcc -Wall -Wextra -g
. Если у вас нет предупреждений, используйте отладчик, такой как GDB, чтобы понять поведение вашего исполняемого файла.
Рассмотрите возможность использования статического анализатора Clang (после получения разрешения на его использование).
Нарисуйте на доске (или на бумаге) фигуру со стрелками, обозначающими указатели (например, двухсвязный список рисунок на википедии), чтобы понять поведение вашей программы.
person
Basile Starynkevitch
schedule
22.01.2021