Двойной пробел, который я не знаю, откуда он взялся - PullRequest
1 голос
/ 27 марта 2020

Я начинаю изучать C и пишу простой код. В этом случае я должен написать код, который перевернет предложение. Я написал некоторый код, и он действительно работает, но в начале перевернутого предложения вместо одного есть два пробела, и я не знаю почему.

#include <stdio.h>

int main(){

int i = 0, n = 0;
char a[100] = {0}, b[100] = {0}, c, term;

printf("Write a sentence: ");

while ((c = getchar()) != '\n'){
    switch (c){
        case '.': case '!': case '?':
            term = c;
            break;
        default:
            a[i] = c;
            i++;
            break;
    }
}

for (; i >= 0; i--){
    if (a[i] == ' '){
        for (n--; n >= 0; n--){
            putchar(b[n]);
        }
        printf(" ");
        n = 0;
    }
    else if (i == 0){
        b[n] = a[i];
        for (; n >= 0; n--){
            putchar(b[n]);
        }
    }
    else{
       b[n] = a[i];
       n++;
    }
}

putchar(term);

return 0;

}

Может у кого-нибудь хватит терпения помочь мне?

Спасибо! :)

1 Ответ

0 голосов
/ 27 марта 2020

Вставьте a[i]='#'; сразу после term = c;.
. Вы увидите, что загадочный пробел фактически является содержимым массива a, который может содержать завершающий символ.

Это в вашем коде иначе не преднамеренно установленный контент получает вывод, потому что ваш l oop заканчивается i ссылкой на эту запись массива. Здесь i++;, где вы разумно всегда увеличиваете i для ссылки на следующую пустую запись массива.

Затем вы, в течение l oop, начинаете обрабатывать эту последнюю запись, которая так и не была записана to.

Чтобы это исправить, вы можете, например, просто вставить i-- между while-l oop и for-l oop.

Session:

Write a sentence: I want to try.
try to want I.
...