Я считаю, что ваша проблема лежит здесь:
if (ch == '\n')
printf("\n\\n ");
Когда вы сталкиваетесь с новой строки в вашем входе, вы будете выводить символ новой строки следуют символы \
и n
.
Но что вы не do is adjust i
, чтобы указать, что вы начали новую линию. Итак, если вы первый символ новой строки, это пятый символ, i
будет по-прежнему 5, и на следующей строке будет меньше десяти символов.
Кроме того, я думаю, вы все еще хотите выводить коды ASCII для новой строки и вкладки, а форматирование требует некоторой работы.
Образец, приведенный ниже, предназначен для вашего образования. Если вы плагиате его, вы, скорее всего, узнаете довольно быстро, поэтому прочитайте его и поймите. Не копируйте его вслепую.
#include <stdio.h>
int main (void) {
int ch;
int i = 0;
printf("Please enter some characters.\n");
while((ch=getchar()) != EOF) {
До сих пор это почти то же самое, что и у вас, теперь мы немного отличаемся. Вместо i % 10 == 0
мы просто запускаем номера непрерывно между 0 и 9 включительно. Это остановит проблемы, когда у вас есть более двух миллиардов или около того символов в вашем входе :-)
// Ten characters printed? Newline and adjust count.
if(i == 10) {
putchar('\n');
i = 0;
}
Теперь единственное реальное изменение форматирования и действия для перевода строки. Он должен закончить с i
быть установлен в ноль после печати, так сочетание новой строки конкретных i = -1
и i++
ниже, что каждый случай проходит через сделает это:
// Handle each case.
if (ch == '\n') {
// Newline? Print and reset to 0 (after i++ below).
printf("\\n %3d\n", ch);
i = -1;
} else if (ch == '\t')
// Tab? Just print tab symbol.
printf("\\t %3d ", ch);
else if (ch < ' ')
// Control character? Print ^X.
printf("^%c %3d ", ch+64, ch);
else
// Otherwise just print character as is.
printf("%2c %3d ", ch, ch);
// Increment count.
i++;
}
return 0;
}
Образец запуска:
pax> echo 'This
...> input crosses many lines, some larger than ten,
...> some smaller.' | ./testprog
Please enter some characters.
T 84 h 104 i 105 s 115 \n 10
i 105 n 110 p 112 u 117 t 116 32 c 99 r 114 o 111 s 115
s 115 e 101 s 115 32 m 109 a 97 n 110 y 121 32 l 108
i 105 n 110 e 101 s 115 , 44 32 s 115 o 111 m 109 e 101
32 l 108 a 97 r 114 g 103 e 101 r 114 32 t 116 h 104
a 97 n 110 32 t 116 e 101 n 110 , 44 \n 10
s 115 o 111 m 109 e 101 32 s 115 m 109 a 97 l 108 l 108
e 101 r 114 . 46 \n 10
Большое спасибо. Я не понял, что должен был сбросить счетчик. Когда вы, ребята, указали на это, я быстро понял. Спасибо. – leocod