我的程序必须每行打印10对。但是,它有时每行打印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;
}发布于 2012-02-27 12:09:30
我相信你的问题出在这里:
if (ch == '\n')
printf( "\n\\n ");当您在输入中遇到换行符时,您将输出一个换行符,后跟字符\和n。
但是您没有做的是调整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之间连续运行数字。当您的输入超过20亿个字符时,这将停止问题:-)
// Ten characters printed? Newline and adjust count.
if(i == 10) {
putchar('\n');
i = 0;
}现在唯一真正的变化是格式和newline的动作。它必须在打印后将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发布于 2012-02-27 12:18:00
问题是,当您在找到换行符时开始新行时,您不会重置i。我建议作出以下改变:
if(char == '\n')
{
printf("\\n 10 ");
i = -1;
}i = -1;重置计数器;考虑到它将在循环底部递增的事实(i = 0; continue;也可以工作)。现在,换行符都是由i%10==0检查处理的,所以我从printf中去掉了换行符。我还添加了'\n'的ASCII码,使其符合规范。
下面是我要做的其他一些更改:
如果您将增量更改为i = (i + 1) % 10,您将消除i溢出的轻微可能性。
打印制表符时,不需要使用格式化来打印ASCII代码;
printf("\\t 9 ");也会做同样的事情,而且可能会稍微快一点,这取决于你的编译器对它进行优化的程度。
为了确保打印出来的东西排列整齐,我会用
printf("^%1c %3d ", ch+64, ch);这纯粹是美学上的。
发布于 2012-02-27 12:13:11
不要忘记:在循环之后:
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上,可能会出现\r‘’。
https://stackoverflow.com/questions/9459918
复制相似问题