C语言 这是一个优雅的方式来初始化一个变量的第一次迭代的循环?[关闭]

fnvucqvd  于 2023-11-17  发布在  其他
关注(0)|答案(3)|浏览(95)

已关闭。此问题为opinion-based。目前不接受回答。
**要改进此问题吗?**更新此问题,以便editing this post可以使用事实和引文来回答。

上个月关门了。
社区上个月审查了是否重新打开这个问题,并将其关闭:
原始关闭原因未解决
Improve this question
这是一个C程序,它将输入复制到输出,将每个包含一个或多个空格的字符串替换为单个空格。我不知道当程序启动时,还没有先前的值时,最好的方法是什么。
我得出了以下结论:

#include <stdio.h>

void main() {

        int actual, previous = -1;

        while((actual = getchar()) != EOF) {
                if(!(previous == ' ' && actual == ' ')) {
                        putchar(actual);
                        previous = actual;
                }
        }
}

字符串
这是可行的,但是我被教导你不应该将变量初始化为随机值。另一种选择是使用do-while循环,但是如果程序得到一个空文件,它将毫无意义地执行if语句。

mwkjh3gx

mwkjh3gx1#

我只需要设置一个可以检查的布尔标志,如果我们不是在第一次迭代中,并且实际字符和前一个字符都是空格,我们可以跳过打印字符和更新前一个字符,并将first_char标志设置为false
这样previous在初始化之前就不会被使用。

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    bool first_char = true;
    int actual, previous;

    while ((actual = getchar()) != EOF) {
        if (!first_char && previous == ' ' && actual == ' ') {
            continue;
        } 
        
        putchar(actual);
        previous = actual;
        first_char = false;
    }  

    return 0;
}

字符串

8wigbo56

8wigbo562#

你可以使用一个in_spaces变量来跟踪你是否在一个空格区域中阅读输入。in_spaces被初始化为0,或者false,因为你不是从一组空格开始阅读的。
如果你在一组空格中,一个空格被读取,只需继续读取下一个字符。否则你总是想打印该字符。如果该字符是一个空格,你在一组空格中,所以in_spaces应该设置为1,或者true。否则该字符不是空格,因此您不在一组空格中,并且in_space应设置为0

#include <stdio.h>

int main(void) {
    int in_spaces = 0;
    int c;
    while ((c = getchar()) != EOF) {
        if (in_spaces && c == ' ') continue;
        putchar(c);
        if (c == ' '){
            in_spaces = 1;
        } else {
            in_spaces = 0;
        }
    }
}

字符串

sg3maiej

sg3maiej3#

如前所述,void main()是不明智的...
如果你关心的是重复的空格(0x 20),那么-1是任意的。同样任意,但不那么不和谐的是0。(事实上,你可以使用除了0x 20之外的任何值!).
将代码折叠到for()循环中可以减少代码量。有用的注解总是有用的。测试代码提供了几个字符串,用于测试重复SP的前导、尾随和中间字符串运行。

#include <stdio.h>

void test( char *str ) {
    putchar( '"' );
    for( int ch, prvCh = ~' '; (ch = *str++) != '\0'; prvCh = ch )
        if( prvCh != ' ' || ch != ' ' ) // suppress successive SP's as single.
            putchar( ch );
    putchar( '"' );
    putchar( '\n' );
}

int main(void) {
    test( "abc     def" ); // test middle SPSPSP
    test( " abc    def " ); // test single leading & trailing SP
    test( "   abc  def   " ); // test multiple leading & trailing SPs
    return 0;
}

字符串
输出量:

"abc def"
" abc def "
" abc def "


请注意prvCh的初始化为~' '..
使用getchar()EOF的变化应该是显而易见的。

相关问题