символы printf с несколькими пробелами? - PullRequest
1 голос
/ 05 января 2020

У меня есть следующий код для замены вкладок в stdin на четыре пробела.
Когда у меня есть stdin, разделенный двумя пробелами, например, «tab tab», последний printf печатает правильную строку «tab tab», однако, когда мой ввод является разделенной табуляцией «tab tab», а затем добавляются четыре пробела вместо этого, последний 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] = '\0';
    printf("last i = %d\n", i);
    printf("string completed: %s\n", s);
};

в консоли, вкладки разделены пробелом

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

1 Ответ

3 голосов
/ 05 января 2020

Вы увеличиваете i один раз слишком много во внутреннем l oop.

После выхода из внутреннего l oop значение i будет равно 7, что будет индексом следующий символ для ввода. Но затем внешний l oop повторяется, увеличивая i еще раз. Поэтому вы пропускаете запись в индекс 7. Когда вы позже попытаетесь напечатать s, он читает этот неинициализированный символ. Этот символ имеет значение 0 в вашем конкретном случае, поэтому кажется, что строка там заканчивается.

Уменьшение i в конце внутреннего l oop, чтобы вернуть его в правильное место.

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