Работих върху K&R упражнение 1-19:
Напишете програма, която обръща своя вход ред по ред.
Написа следната програма:
#include <stdio.h>
#define MAXLINE 1000
main () {
int c, x, y, z;
char ip[MAXLINE];
char ln[MAXLINE];
char rv[MAXLINE];
for (x = 0;(c=getchar()) != EOF; ++x)
ip[x] = c;
for (x = 0; ip[x] != '\0'; ++x) {
for (y = 0; ip[x] != '\n'; ++y) {
ln[y] = ip[x];
++x;
}
for (z = 0; y != -1; ++z) {
rv[z] = ln[y];
--y;
}
printf("%s\n", rv);
}
}
Проблемът ми е, че изходът на тази програма е изключително непоследователен; даден същия (многоредов) вход, понякога ще отпечата всеки ред наобратно с добавено водещо празно пространство, понякога ще възпроизведе само първия ред наобратно, последван от празни редове, понякога ще отпечата боклук, а понякога просто получавам съобщение за грешка.
Някой сблъсквал ли се е с такъв вид волатилност преди, без да промени кода си? Как да го поправя?
ip
. Зададохте ли нулевия знак, когато го прочетохте? - person Jeff Mercado   schedule 25.02.2016'\0'
прекратилиip
низа, ноx
цикълът търсиip[x] != '\0'
. И не сте поставили'\0'
в края на низаrv
, което означава, чеprintf
ще премине края на низа. - person user3386109   schedule 25.02.2016\n
, за да намери края на реда. И същият този цикъл трябва да проверява броя на знаците в реда, така че входният буфер да не бъде препълнен. - person user3629249   schedule 25.02.2016main()
Всички те имат тип на връщане и (освен ако не работите на гола машина без OS, този тип на връщане ще бъдеint
- person user3629249   schedule 25.02.2016