2012-02-27 2 views
2

Моя программа должна печатать 10 пар в строке. Тем не менее, он печатает по 10 пар на линию, а иногда - нет. Я не могу понять, что я делаю неправильно. Я дважды читал книгу. Я понимаю, как работает модуль, но похоже, что я не могу использовать его здесь очень хорошо. Что мне здесь не хватает?C программирование. 10 пар в строке?

Это то, что я написал:

Я хотел бы знать, почему не печатает 10 пар в каждой строке все время.

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
int ch; 
int i=0; /* counter */ 

printf("Please enter some characters.\n\n"); 

while((ch=getchar()) != EOF) 
{ 
if((i%10) == 0) 
    putchar('\n'); /*printf("\n); */ 

if (ch == '\n') 
    printf("\n\\n "); 
else if (ch == '\t') 
    printf("\\t %d ", ch); 
else if (ch < ' ') 
    printf("^%2c %3d ", ch+64, ch); 
else 
    printf("%2c %3d ",ch, ch); 

i = i+1; 
} 
return 0; 
} 

ответ

2

Я считаю, что ваша проблема лежит здесь:

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 
+0

Большое спасибо. Я не понял, что должен был сбросить счетчик. Когда вы, ребята, указали на это, я быстро понял. Спасибо. – leocod

0

Чтобы не забыть: после цикла:

if((i%10) == 0) 
    putchar('\n'); /*printf("\n); */ 

ошибка:

printf("\n\\n "); 

Должно быть:

printf("\\n "); 

Последовал:

else if (ch < 32) { 
    if (1 <= ch && ch <= 26) { 
     printf("Ctrl+%c ", 'A' - 1 + ch); 
    } else { 
     printf("Ctrl+%c ", 'A' - 1 + ch); // Whatever 
    } 
} 

Особенно на Windows, `\ г» может произойти.

+0

Спасибо. Я не понял, что мне нужно сбросить счетчик. После того, как я сбросил счет, жизнь была лучше. – leocod

0

Если на входе есть новая строка, программа ur wil выводит новый онлайн. Таким образом, не всегда должно быть 10 символов на выходе.

2

Проблема в том, что когда вы начинаете новую строку при поиске символа новой строки, вы не сбрасываете i. Я хотел бы предложить следующее изменение:

if(char == '\n') 
{ 
    printf("\\n 10 "); 
    i = -1; 
} 

i = -1; сбрасывает счетчик; учитывая, что он будет увеличиваться в нижней части цикла (также будет работать i = 0; continue;). Теперь новые строки обрабатываются проверкой на i%10==0, поэтому я взял новую строку из printf. Я также добавил в код ASCII для '\n', чтобы он соответствовал спецификациям.

Несколько других изменений я хотел бы сделать:

Если изменить приращение к i = (i + 1) % 10, вы будете устранить небольшую возможность i переполняет.

Когда вы печатаете символ табуляции, нет необходимости использовать форматирование для печати кода ASCII;

printf("\\t 9 "); 

будет делать то же самое, и может быть немного быстрее, в зависимости от того, насколько хорошо ваш компилятор оптимизирует его.

Чтобы вещи выстраиваться красиво, когда они напечатаны, я бы печатать непечатаемые символы с

printf("^%1c %3d ", ch+64, ch); 

Это чисто эстетический.

+0

Большое спасибо. Я просто не понял, что мне пришлось сбросить счетчик. Замечательно, что мы все можем многому научиться друг у друга на этом сайте. – leocod

-1

программа печати пробельные в то время как он работает ~ вы должны добавить еще, если заявление перепрыгнуть через символ пробела ~ код должен быть, как это ~

else if(ch == ' ') 
continue; 
Смежные вопросы