Я пытаюсь отменить ввод в c.
Input: Hello World
Output: dlroW olleH
Actual Output:
Я протестировал код с помощью putchar, и кажется, что он помещает правильные символы в правильное положение, однако ничего не выводит. Код ниже:
#include <stdio.h>
#define MAXLEN 1000
int getLine(char s[]);
void reverse(char r[], char s[], int len);
int main()
{
char string[MAXLEN];
char reversed[MAXLEN];
int len;
while((len = getLine(string)) != 0)
{
reverse(reversed, string, len);
printf("%s\n", reversed);
}
return 0;
}
int getLine(char line[])
{
int i, c;
i = 0;
while((c = getchar()) != EOF && c != '\n')
{
line[i] = c;
i++;
}
line[i + 1] = '\0';
return i;
}
void reverse(char r[], char s[], int len)
{
int i;
i = 0;
while(len >= 0)
{
r[i++] = s[len--];
}
r[i] = '\0';
}
line[i + 1] = '\0'; --> line[i] = '\0';Вам также кажется (не)повезло, что string для вас обнулено — если я добавлю memset(string, 'X', MAXLEN - 1); перед циклом (и #include <string.h> перед main(), то я увижу X и перевернутую строку.
Хм, я попытался добавить memset, и это ничего не изменило. Хотя спасибо за помощь!





Есть как минимум 2 очевидные проблемы:
line[i] = '\0';, а не line[i + 1] = '\0' для завершения нуля.reverse() вам нужно использовать r[i++] = s[--len];, а не r[i++] = s[len--];. Если вы этого не сделаете, у вас будет недопустимый доступ к памяти.Вы должны определить, что getLine() означает длина. Это количество символов, вставленных в массив, или количество символов, исключая «\ 0», которым завершается строка. Вот для чего нужны комментарии кода:
int getLine(char line[])
{
int i = 0, c;
while ((c = getchar()) != EOF && c != '\n')
{
line[i++] = c;
}
line[i] = '\0';
return i; // return array length, not counting final \0
}
Что бы вы ни решили, это не может иметь смысла:
r[i++] = s[len--];
В одном случае вы поместите символ завершения строки '\0' в качестве первого символа новой строки, всегда возвращая пустую строку, или в другом случае вы будете копировать мусорную память в новую строку. С точки зрения массива на основе 0-индексов, длина должен означать единицу за последним индексом. Таким образом, последний элемент в массиве должен быть s[len - 1]. Вместо того, чтобы отсчитывать len, я предлагаю вам считать i, пока оно не достигнет len:
void reverse(char r[], const char s[], size_t length)
{
int i = 0;
while (i < length)
{
r[i] = s[length - 1 - i];
i++;
}
r[i] = '\0';
}
Вы помещаете нулевой байт в конце строки в первый символ, таким образом делая (обратную) строку нулевой длины?