首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言编程。每行10对?

C语言编程。每行10对?
EN

Stack Overflow用户
提问于 2012-02-27 12:05:13
回答 5查看 756关注 0票数 3

我的程序必须每行打印10对。但是,它有时每行打印10对,另一次则不打印。我不知道我做错了什么。这本书的章节我读了两遍。我理解模块操作是如何工作的,但看起来我在这里不能很好地使用它。这里我漏掉了什么?

这是我写的:

我想知道为什么没有一直每行打印10对。

代码语言:javascript
复制
#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;
}
EN

回答 5

Stack Overflow用户

发布于 2012-02-27 12:09:30

我相信你的问题出在这里:

代码语言:javascript
复制
if (ch == '\n')
    printf( "\n\\n ");

当您在输入中遇到换行符时,您将输出一个换行符,后跟字符\n

但是您没有做的是调整i来指示您已经开始了一个新的行。所以,如果你的第一个换行符是第五个字符,i仍然是5,下一行少于十个字符。

此外,我认为您仍然希望输出换行符和制表符的ASCII代码,并且格式化需要一些工作。

以下示例仅供您参考。如果你抄袭了它,你很可能很快就会被发现,所以请阅读并理解它。不要盲目照搬。

代码语言:javascript
复制
#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亿个字符时,这将停止问题:-)

代码语言:javascript
复制
        // Ten characters printed? Newline and adjust count.

        if(i == 10) {
            putchar('\n');
            i = 0;
        }

现在唯一真正的变化是格式和newline的动作。它必须在打印后将i设置为零,这样特定于换行符的i = -1和下面每个案例所经历的i++的组合就可以做到这一点:

代码语言:javascript
复制
        // 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;
}

示例运行:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2012-02-27 12:18:00

问题是,当您在找到换行符时开始新行时,您不会重置i。我建议作出以下改变:

代码语言:javascript
复制
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代码;

代码语言:javascript
复制
printf("\\t   9  ");

也会做同样的事情,而且可能会稍微快一点,这取决于你的编译器对它进行优化的程度。

为了确保打印出来的东西排列整齐,我会用

代码语言:javascript
复制
printf("^%1c %3d  ", ch+64, ch);

这纯粹是美学上的。

票数 2
EN

Stack Overflow用户

发布于 2012-02-27 12:13:11

不要忘记:在循环之后:

代码语言:javascript
复制
if((i%10) == 0)
    putchar('\n');   /*printf("\n); */

错误是:

代码语言:javascript
复制
printf( "\n\\n ");

应该是:

代码语言:javascript
复制
printf( "\\n ");

然后是:

代码语言:javascript
复制
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‘’。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9459918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档