我的程序必须每行打印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;
}
答案 0 :(得分:2)
我相信你的问题在于:
if (ch == '\n')
printf( "\n\\n ");
当您在输入中遇到换行符时,您将输出换行符,后跟字符\
和n
。
但不做的是调整i
以表示您已开始新线路。所以,如果你是第一个换行符是第五个字符,那么i
仍然是5,而下一行你将少于10个字符。
此外,我认为您仍然希望输出换行符和制表符的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;
}
现在唯一真正的变化是格式化和换行的操作。最终必须在打印后将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
答案 1 :(得分:2)
问题在于,当您在找到换行符后开始一个新行时,您不会重置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);
这纯粹是美学。
答案 2 :(得分: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上,`\ r'可能会发生。
答案 3 :(得分:0)
如果输入中有换行符,则程序将输出一个新的在线。这样输出中可能不会有10个字符
答案 4 :(得分:-1)
你的程序在运行时打印空白〜你应该添加else if语句跳过空白字符〜 代码应该是这样的〜
else if(ch == ' ')
continue;