如何使用数组在C中用单个空格替换(多个)空白字符(空格、制表符、换行符)的所有实例?

如何使用数组在C中用单个空格替换(多个)空白字符(空格、制表符、换行符)的所有实例?,c,algorithm,array-algorithms,C,Algorithm,Array Algorithms,我尝试使用getchar来解决这个问题,但现在我使用fgets逐行获取文本,整个文本存储在一个数组中。我想用一个空格替换多个空格字符的所有实例,包括空格、制表符和换行符。 这就是我使用getchar所做的: int c; while ((c = getchar ()) != EOF { if (c == '\r') continue; if (c == '\n') { putchar (c); while ((c = getcha

我尝试使用getchar来解决这个问题,但现在我使用fgets逐行获取文本,整个文本存储在一个数组中。我想用一个空格替换多个空格字符的所有实例,包括空格、制表符和换行符。 这就是我使用getchar所做的:

 int c;

while ((c = getchar ()) != EOF
{
    if (c == '\r') continue;
    if (c == '\n') {       
        putchar (c);
        while ((c = getchar ()) == '\n' || c == '\r') {}
        if (c != EOF) ungetc (c, stdin); else break;
        continue;
    }
    if (c == ' ' || c == '\t') {  
        putchar (' ');
        while ((c = getchar ()) == ' ' || c == '\t') {}
        if (c != EOF) ungetc(c, stdin); else break;
        continue;
    }
    putchar (c);
}
return 0;
}

现在,我正在尝试这样做:

while (1) {
    if (fgets(line,max_len, stdin) == NULL) break;
    for (int i=0;i<strlen(line);i++){
        text[n++]=line[i];
    }
}
每个文本都存储在一个数组中,我想从中筛选它

不要重复你自己:你只需要一个getc和一个putc 在循环中,您只需要记住上一个输出的字符是否为空。 中断并继续存在是有原因的。 重写字符缓冲区的类似逻辑:


正如您所见,您不需要缓冲区,它只会使事情变得复杂。

这个答案将在目标中插入一个空格,而OPs的问题是:如何将多个空格压缩为一个空格它将用一个空格替换多个空格,并保持所有其他字符不变。
int count;

for(count=0; ; ) {
    int ch; 
    ch = getc(stdin);
    if( ch == EOF) break;
    switch(ch) {
    case ' ':
    case '\t':
    case '\n':
    case '\r':
            if(count++) continue;
            ch = ' ';
            break;
    default:
            count=0;
            break;
            }
    putc(ch, stdout);
    }
char line[100];
while ( fgets(line,sizeof line, stdin) ) {
    unsigned dst,src,count;  
    for (count=dst=src=0; line[dst]=line[src++];){
        switch(line[dst]) {
        case ' ':
        case '\t':
        case '\n':
        case '\r':
            if(count++) continue;
            line[dst++] = ' ';
            break;
        default:
            dst++;
            count=0;
            break;
            }
        }
    fputs(line,stdout);
    }