Ваша программа потерпит неудачу, если значение n не соответствует количеству символов во входной строке, главным образом потому, что вы не инициализируете выделенную память.
e.g.
n = 10
c = "hello"
длина c равна 5 но вы выделили 11 байтов, поэтому байты после hello \ n \ 0 неинициализированы в c, поскольку fgets не заполнит их для вас.
в памяти это выглядит примерно так
+---+---+---+---+---+---+---+---+---+---+---+
c ->| h | e | l | l | o |\n |\0 | | | | |
+---+---+---+---+---+---+---+---+---+---+---+
когда вы переворачиваете строку с помощью
*(o + i) = *(c + n - 1 - i)
, поскольку вы используете n
в качестве смещения для начала копирования символов, вы начинаете за пределами позиции копирования "привет \ n \ 0" 9 (10 - 1 - 0) и помещая это как первый символ в o
, но, поскольку все c
не инициализировано, может быть что угодно, даже даже \0
, который может объяснить, почему вы ничего не печатаете.
лучше, чтобы после прочтения строки вычислить длину строки с помощью простого значения для l oop
int len = 0;
for (len = 0; c[len] && c[len] != '\n'; ++len);
, а затем использовать len
в качестве смещения вместо n
*(o + i) = *(c + len - 1 + i)