OriginalGriff
Если вы попробуете:
void reverse(char *s1){
char a[100];
char *s2;
int i=0;
s2=&a[0];
while(*s1!='\0'){
s1++;
i++;
}
s1--;
i--;
while(i>=0){
*s2=*s1;
s2++;
s1--;
i--;
}
printf("%s\n", a);
}
int main()
{
char s[] = "Hello World!";
printf("%s\n", s);
reverse(s);
return 0;
}
Тогда вы получите результат:
Hello World!
!dlroW olleH
Но... это, вероятно, больше по счастливой случайности, чем по здравому смыслу. Проблема в том, что вы не копируете символ окончания строки '\0' из вашего ввода в ваш вывод, как это легко доказать, "предварительно заполнив" массив идентифицируемым мусором:
char *s2;
int i=0;
for (i = 0; i < 100; i++)a[i] = 'X';
i = 0;
Теперь когда вы печатаете вы получаете:
Hello World!
!dlroW olleHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX����l7n��
Потому что в выходной строке нет ничего, что указывало бы printf, когда нужно остановиться!
Либо установите null в конце перевернутой строки, либо предварительно заполните "a" для всех нулей.
Однако я бы сделал это по-другому, всего с одним циклом:
int *inp = s1;
int *outp = &(a[99]);
do
{
copy from inp to outp
if (inp was a null or you run out of space) exit the loop
inc inp, dec outp
} while (true);
Затем напечатать на обратной строкой непосредственно из выходного
Имейте в виду, что эта функция бесполезна, если вы не вернете перевернутую строку - но вы не можете вернуть a или любой указатель на ее часть - она находится в стеке и вызовет серьезные проблемы, если вы это сделаете. Вам нужно будет использовать malloc для выделения пространства, а не объявлять массив в стеке, а затем организовать его освобождение. Было бы лучше передать в функцию как строку, так и область вывода.