具有多个 space 个字符的 printf 符号?

printf symbols with multiple space characters?

我有以下代码可以将标准输入中出现的制表符替换为四个 space。
当我有标准输入时,由两个 space 分隔,例如"tab tab",最后的 printf 打印正确的字符串 "tab tab",但是当我的输入是制表符分隔 "tab tab",然后添加四个 space 字符时,最后的 printf 只打印"tab" 字符串,仅此而已。任何建议表示赞赏。

#include <stdio.h>
#define MAX 1000
#define TAB 4

void read_stdin(char s[], int len);

int main(){
    char str[MAX];
    read_stdin(str, MAX);
    return 0;
};

void read_stdin(char s[], int len){
    int i, ii;
    int c;
    for (i = 0; i < len && (c = getchar()) != EOF; i++){
        printf("c = %d, i = %d\n", c, i);

        if (c == '\t'){
            for (ii = 0; ii < TAB; ii++){
                printf("space ");
                s[i] = ' ';
                i++;
                printf("i = %d\n", i);
            };
        } else {
            s[i] = c;
        };
    };

    s[i] = '[=11=]';
    printf("last i = %d\n", i);
    printf("string completed: %s\n", s);
};

在控制台中,制表符由 space 个字符分隔

tab tab
c = 116, i = 0
c = 97, i = 1
c = 98, i = 2
c = 32, i = 3
c = 116, i = 4
c = 97, i = 5
c = 98, i = 6
c = 10, i = 7
last i = 8
string completed: tab tab

和由制表符分隔的制表符

tab tab
c = 116, i = 0
c = 97, i = 1
c = 98, i = 2
c = 9, i = 3
space i = 4
space i = 5
space i = 6
space i = 7
c = 116, i = 8
c = 97, i = 9
c = 98, i = 10
c = 10, i = 11
last i = 12
string completed: tab

你在内部循环中递增 i 太多了。

在内部循环退出后,i 的值为 7,这将是下一个要输入的字符的索引。但随后外循环迭代,再次增加 i 。所以你跳过写入索引 7。当你稍后尝试打印 s 时,它会读取这个未初始化的字符。在您的特定情况下,该字符恰好具有值 0,因此字符串似乎在那里结束。

在内循环结束时递减 i 以将其放回正确的位置。

        for (ii = 0; ii < TAB; ii++){
            printf("space ");
            s[i] = ' ';
            i++;
            printf("i = %d\n", i);
        };
        i--;