Putchar, getchar, пропущенный символ в цикле while

У меня проблема с этим фрагментом кода, он должен заменить строчные буквы на прописные и превратить несколько пробелов в один пробел. Итак, что он делает неправильно, он каким-то образом обрезает первую букву, например, когда я пишу «abcdefg», он дает мне на выходе «BCDEFG».

main(){ 
int z=0,b;  

        while ( (b = getchar() ) != '\n')
        { 
        b=b-32;
            if (b>0)
            { 
                putchar(b);
            }
            else 
            {
                if (z>=2)
                { 
                    putchar(b);
                }
                else
                { 
                    z=z+1;
                    printf(" ");
                }
            }


        }
}

person mmajewsk    schedule 14.03.2012    source источник


Ответы (4)


Кажется, он генерирует все буквы для меня ... вы пытались его отследить, чтобы узнать, что он делает на каждом шаге с введенными вами символами?

person JTeagle    schedule 14.03.2012
comment
Вау, я не знаю как, но теперь все равно работает нормально, спасибо. - person mmajewsk; 14.03.2012

У вашей обработки пустого пространства есть некоторые проблемы.

Кажется, вы в любом случае будете печатать пробел (когда ваш getchar возвращает 0x20).

person Sint    schedule 14.03.2012

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

main(){ 
int z=1,b;  

        while ( (b = getchar() ) != '\n')
        { 
        b=b-32;
            if (b>0)
            { 
                putchar(b);
                z=1;
            }
            else 
            {
                if (z>=2)
                { 
                    putchar(b);
                }
                else
                { 
                    z=z+1;
                    printf(" ");
                }
            }


        }
}
person bill    schedule 14.03.2012

Во-первых, вы никогда не должны использовать константы, такие как «32», а вместо этого позволить системе определять, что представляют собой значения. IE: b -= char(' ');

Во-вторых, взгляните на функции «islower()» и «toupper()», и C автоматически сделает это за вас.

Рассмотрим что-то вроде этого:

включать

главный () {

    int     flag = 0;
    char    b;

    while ((b=getchar()) != '\n') {
            if (flag && isspace(b))
                    continue;
            putchar(toupper(b));
            if (isspace(b)) {
                    flag = 1;
                    continue;
            }
            flag = 0;
    }
    putchar('\n');

}

Ввод: "a bc def ghijghg 123 a1b2c3"

Вывод: "A BC DEF GHIJGHG 123 A1B2C3"

Примечание. Похоже, что текстовое поле удаляет пробелы, так как в строке ввода много пробелов.

Вы всегда должны знать о своих граничных условиях. Если ввод начинается с кучи пробелов, он все равно будет печатать один пробел. Чтобы удалить все начальные пробелы, инициализируйте flag = 1. Он также напечатает последний пробел, если во входных данных есть конечные пробелы. Чтобы устранить их, вам понадобится немного другое решение, в котором вы печатаете пробел после того, как видите пробел и другой печатный символ.

person Rod Meyer    schedule 14.03.2012