C编程。每行10对?

时间:2012-02-27 04:05:13

标签: c

我的程序必须每行打印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;
}

5 个答案:

答案 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 = -1i++的组合将会执行此操作:

        // 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;