4

我正在用 C 语言创建一个荒谬的简单程序来处理getchar(). 该程序将打印出您输入的内容,直到您按下回车键,它会保证您的每行不超过 80 个字符。为此,我不断计算输入了多少个字符。一旦字符数达到 70,遇到的下一个空格将导致换行。如果在 70-80 之间没有遇到空格,则无论如何都会发生换行符。我意识到这是一个超级幼稚的实现,可以左右优化,但请记住,我只是在胡闹:

while ((c = getchar()) != '\n') {
    if (lineLengthCount < 70) {
        putchar(c);
        lineLengthCount++;
    }   
    else if (lineLengthCount < 80 && (c == ' ')) {
        printf("%c\n", c); 
        lineLengthCount = 0;
    }   
    else {
        printf("%c\n", c); 
        lineLengthCount = 0;
    }   
}   

问题是c == ' '条件似乎实际上并没有检查空格。我得到这样的输出:

fitter happier more productive comfortable not drinking too much regula
r exercise at the gym three days a week getting on better with your ass
ociate employee contemporaries at ease eating well no microwaved dinner

我希望在遇到空格时会截断这些行。相反,无论在第 70 行之后输入什么字符,都会创建一个新行。我错过了什么吗?' '真的意味着任何字符吗?

4

4 回答 4

5
while ((c = getchar()) != '\n') {
    if (lineLengthCount < 70) {
        putchar(c);
        lineLengthCount++;
    }   
    else if (lineLengthCount < 80 && (c == ' ')) {
        printf("%c\n", c); 
        lineLengthCount = 0;
    }   
    else if (lineLengthCount >= 80){
        printf("%c\n", c); 
        lineLengthCount = 0;
    }
    else{
        putchar(c);
        lineLengthCount++;
    }
}

我认为这应该有效。这应该可以防止 else 在少于 80 个字符但字符不是空格时执行。

编辑:我现在意识到,如果 lineLengthCount 小于 80 但字符不是空格,它根本不会被打印,所以我在最后添加了另一个 else 来修复它。

这不是更短更简洁吗?

while ((c = getchar()) != '\n') {
    putchar(c);
    if((c == ' ' && lineLengthCount >= 70) || lineLengthCount >= 80){
        printf("\n");
        lineLengthCount = 0;
    }
    else
        ++lineLengthCount;
}
于 2013-03-10T19:54:05.570 回答
4

您的条件有问题:如果lineLengthCount> 70 但下一个字符不是空格,则最后一个字符else将被击中,换行并重置计数器。

于 2013-03-10T19:51:06.287 回答
1

如果您完全不确定发生了什么,我建议将“if”条件分解为三个显式检查:

while ((c = getchar()) != '\n') {
    lineLengthCount++;
    if (lineLengthCount < 70) {
        putchar(c);
    }   

    if (lineLengthCount < 80 && (c == ' ')) {
        printf("%c\n", c); 
        lineLengthCount = 0;
    }   

    if (lineLengthCount == 80) {
        printf("%c\n", c); 
        lineLengthCount = 0;
    }   
}   

如果您想查看发生了什么,请在每个“if”中编写一些调试输出以注意它何时被调用。

一旦它起作用,并且您了解原因,您可以对其进行编辑并结合“ifs”......

于 2013-03-10T19:56:14.580 回答
1

使用 ' ' 是完全有效的。您也可以尝试使用 C 标准库函数 isspace() 来检查字符是否为空格。该函数返回一个布尔表达式,如:

char ch = '0';

if (isspace(ch))
    //the char is a space...

'is space' 这个函数实际上是指任何 'whitespace' 字符,因此包括 '\n' 或任何其他打印为空格的字符。

您也可以使用十进制值 32,这意味着与空格相同:

if (ch==32)

但是为了可读性,我宁愿使用第一个版本!

于 2013-03-10T19:58:30.147 回答