Подводя итог сделанным комментариям:
Во-первых, имя функции reverse_string()
вводит в заблуждение, поскольку оно не переворачивает строку, а только печатает ее в обратном порядке.
Функцияследует взять указатель на const char
, а не указатель на char
.Некоторые также могут утверждать, что использование []
в списке параметров несколько вводит в заблуждение, поскольку это может заставить людей, не очень знакомых с C, поверить, что массив передается вместо указателя на его первый элемент.
Обе функциииспользуйте printf()
для печати одного символа.Это включает в себя ненужную работу синтаксического анализа строки формата только для вывода по одному символу за раз.Вместо этого используйте ´putchar () or
fputc () `.
Функциональное различие между двумя функциями: ваша версия не печатает символ новой строки после обратной строки.Версия из книги делает это, но, подобно использованию printf()
для одного символа, она делает это скрытно, используя puts("")
вместо putchar('\n')
.
Версия из книги может иметь потенциально неопределенное поведение, когдав функцию передается пустая строка, поскольку в этом случае t
будет указывать перед первым элементом массива, на который указывает s
, который не гарантированно работает.
Ваша версия использует int
eger для хранения результата strlen()
, который имеет тип size_t
.Возможно, что int
eger переполнится для очень длинных строк.
Два возможных решения:
#include <string.h> // strlen()
#include <stdio.h> // putchar()
void print_reverse(char const *str)
{
for (char const *p = str + strlen(str); p != str; putchar(*--p));
putchar('\n');
}
или использование индекса:
#include <string.h> // strlen()
#include <stdio.h> // putchar()
void print_reverse(char const *str)
{
for (size_t i = strlen(str); i; putchar(str[--i]));
putchar('\n');
}