Аз съм доста нов в програмирането, така че моля, имайте търпение.
Ето подканата за упражнение 1-18: Напишете програма за премахване на завършващи празни места и раздели от всеки ред на въвеждане и за изтриване на изцяло празни редове.
И ето моят код:
#include <stdio.h>
#define MAXLINE 1000
int better_line_length(char line[], int lim);
void copy(char to[], char from[]);
int main(void)
{
int len, a;
char s[MAXLINE];
char better_s[MAXLINE];
while ((better_line_length(s, MAXLINE)) > 0) {
copy(better_s, s);
printf("%s\n", better_s);
}
return 0;
}
int better_line_length(char s[], int lim)
{
int c, i, last_letter = 0;
for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) {
s[i] = c;
if (c != ' ' && c != '\t')
last_letter = i+1;
}
if (c == '\n' && s[0] == c)
last_letter = 0;
s[last_letter] = '\0';
return last_letter;
}
void copy(char to[], char from[])
{
int i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
Моята програма не ми дава резултата, който очаквам. Той правилно премахва завършващите празни места и раздели при липса на празен ред, но нещата стават странни, когато има празен ред.
Например, ако въведеното ми е (където ▯▯▯ са интервали)
abcdefg▯▯▯▯▯▯▯▯▯▯▯▯
1234▯▯▯▯▯
Получавам очаквания резултат от
abcdefg
1234
Но ако моята информация е нещо подобно
abcdefg▯▯▯▯▯▯▯▯▯▯▯▯
1234▯▯▯▯▯
xyz▯▯▯▯▯▯
987▯▯▯▯▯
Получавам резултат от
abcdefg
1234
Но очаквам резултат от
abcdefg
1234
xyz
987
Изглежда като моят оператор while, while ((better_line_length(s, MAXLINE)) > 0)
в main()
спира да се изпълнява, когато срещне празен ред, вместо просто да го прескочи. Прекарах часове на това и все още не мога да разбера защо. Мислех, че настройката на better_line_length
да връща 0, ако първият знак на ред е '\n'
ще коригира кода, но това не променя нищо.
Защо срещам този неочакван изход и защо горната идея не коригира моята програма?
Моля, не забравяйте, че K&R не въвежда определени теми за напреднали до много след глава 1, така че указателите и някои други теми все още нямат смисъл за мен.
Благодаря!