Вот задача:
Напишите функцию reverse(s), которая переворачивает строку символов s . Используйте его, чтобы написать программу, которая переворачивает ввод построчно.
Хорошо, теперь мое выступление:
#include <stdio.h>
#define LIM 40
char line[LIM];
int c;
int reverse(char line[], int lim);
int len;
int main(void) {
while ((len = reverse(line, LIM)) > 0) {
;
}
printf("\n END OF THE PROGRAM \n");
return 0;
}
********** THE REVERSE FUNCTION*********
int reverse(char s[], int lim) {
char rev[LIM];
int i;
for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) {
s[i] = c;
}
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
int r;
for (r = 0; r < lim - 1; ++r) {
rev[r] = s[i];
--i;
}
int x;
for (x = 0; x < lim - 1; ++x) {
putchar(rev[x]);
}
printf("\n");
return r;
}
Вроде работает правильно, но есть некоторые баги, связанные с выводом. Например:
ВВОД: привет всем ВЫВОД: ydobyreve olleh
ВВОД: abc ВЫВОД: cba'
ВХОД: ABC ВЫХОД: CBA'
ВХОД: ABC ABC ВЫХОД: CBA CBA
ВХОД: se se ВЫВОД: es es'
Видеть? В конце вывода происходит какой-то странный " ' ", и я не могу понять, почему эти "артефакты" печатаются. Это происходит случайно (у меня). Не могли бы вы подсказать что-нибудь, что не так в коде?
line
в функциюreverse
, но больше нигде ее не использовать? Тройное условие, еслиfor
? - person John3136   schedule 28.11.2016reverse
просто перевернуть строку: не читать строку и не записывать строку. Затем вы можете сконцентрироваться на выполнении одной задачи и просто давать ей готовый ввод, пока она не заработает. Подумайте, хотите ли вы просто напечатать перевернутую строку или перевернуть ее на месте или перевернуть ее копию. - person John3136   schedule 28.11.2016lim - 1
, что составляет все 40 символов. Они должны выполняться только для того количества символов, которое фактически содержится в строке. Таким образом, во втором цикле вы должны зацикливаться до тех пор, покаi
не достигнет 0, при этом увеличиваяr
внутри цикла. Затем 3-й цикл может выполняться до тех пор, покаx
не станет равнымr
. - person user3386109   schedule 28.11.2016