Может быть, я просто старый и сварливый, но другие ответы, которые я видел, похоже, полностью упускают из виду.
C не выполняет присваивания массивов, точка. Вы не можете назначить один массив другому массиву простым присваиванием, в отличие от некоторых других языков (например, PL / 1; Pascal и многие его потомки - Ada, Modula, Oberon и т. Д.). Также C не имеет строкового типа. Он содержит только массивы символов, и вы не можете копировать массивы символов (больше, чем вы можете копировать массивы любого другого типа) без использования цикла или вызова функции. [Строковые литералы на самом деле не считаются строковым типом.]
Копируется только один раз, когда массив внедряется в структуру и вы присваиваете структуру.
В моей копии K & R 2nd Edition, упражнение 1-19 просит функцию reverse(s)
; в моей копии K & R 1st Edition это было упражнение 1-17 вместо 1-19, но был задан тот же вопрос.
Поскольку указатели не были рассмотрены на данном этапе, решение должно использовать индексы вместо указателей. Я считаю, что это приводит к:
#include <string.h>
void reverse(char s[])
{
int i = 0;
int j = strlen(s) - 1;
while (i < j)
{
char c = s[i];
s[i++] = s[j];
s[j--] = c;
}
}
#ifdef TEST
#include <stdio.h>
int main(void)
{
char buffer[256];
while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
int len = strlen(buffer);
if (len == 0)
break;
buffer[len-1] = '\0'; /* Zap newline */
printf("In: <<%s>>\n", buffer);
reverse(buffer);
printf("Out: <<%s>>\n", buffer);
}
return(0);
}
#endif /* TEST */
Скомпилируйте это с параметром -DTEST, чтобы включить тестовую программу и не иметь только определенной функции reverse()
.
С помощью сигнатуры функции, указанной в вопросе, вы не будете вызывать strlen()
дважды на строку ввода. Обратите внимание на использование fgets()
- даже в тестовых программах использование gets()
- плохая идея. Недостатком fgets()
по сравнению с gets()
является то, что fgets()
не удаляет завершающий символ новой строки, где gets()
. Плюсы fgets()
в том, что вы не получаете переполнения массива, и вы можете сказать, нашла ли программа новую строку или ей не хватило места (или данных), прежде чем встретить новую строку.