Код для изменения регистра введенной строки в C - PullRequest
0 голосов
/ 01 июля 2018
#include <stdio.h>

int main()
{
    int c;
    while ( (c = getchar()) != EOF )
    {
        if (c >= 65 && c <= 90)
            c += 32;
        else if (c >= 97 &&c <= 122)
            c -= 32;
        putchar(c);
    }
    return 0;
}

В коде, как ввод интерпретируется, обрабатывается и печатается?

Например, если мы введем abcde, мы получим вывод ABCDE. Поскольку мы обрабатываем входной символ за символом, мы должны получить выходной символ за символом, но мы получим вывод, как только нажмем ввод. Пока мы не нажмем Enter, где находится хранилище вывода.

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

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

Очередь: следует за принципом «первым пришел - первым вышел». Принцип подобен приоритету, которому следуют, в то время как очередь людей, ждущих, чтобы купить новые iPhone.

Входной поток ведет себя как очередь. Считайте это Скуби Ду. Даже того, что Он съел, достаточно для того дня, когда он не перестанет есть. Если кто-то предлагает две тонны еды на завтрак, Скуби съедает весь завтрак и все равно просит обед.

Входной поток похож на Scooby Doo. Посмотри этот код!

 char c=getchar();

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

Но обратите внимание, что проверка EOF - плохая практика, потому что по многим причинам я перечислю причины в конце.

Приходя к вашему Вопросу! Почему персонаж не печатается один за другим?

Изучение самого потока - большая область. Так что просто для вашего удобства подумайте, что у входного потока будет какой-то скрытый файл (очередь) для хранения любого введенного вами символа. Печатание персонажа в потоке похоже на стрельбу из пулемета непрерывно. Нет никакой возможности подождать, пока пулемет перестанет стрелять, чтобы выполнить контратаку.

Аналогично, пока вы печатаете символ в потоке, файл просто вставит в него каждый символ. После того, как вы ввели команду enter или EOF 'Cntl + D'.

Тогда ваш код будет заглядывать в файл символ за символом (запомните основной IN первым). Если условие удовлетворяется, оно прекращает выполнение там и не заботится о следующих оставшихся символах в файле.

В вашем случае он будет искать все символы в файле после ввода пользователем команды enter или EOF и меняет их регистры (с верхнего на нижний и наоборот)

Как я и обещал! Почему не стоит проверять EOF!

  • Одной из причин является то, что нажатие клавиши создает условие конца файла из Клавиатура не является стандартной, но отличается между платформами.

  • Другая причина заключается в том, что завершение программы лучше всего делать более явно (например, с помощью команды «выйти»).

  • Третья причина заключается в том, что могут возникнуть другие условия ошибки, и эта проверка не обнаружит их.

Так что постарайтесь избежать этого.

0 голосов
/ 01 июля 2018

stdin и stdout являются буферизованными потоками. Вы можете установить для них небуферизацию, но это может привести к значительному снижению производительности. И даже если вы установите для них небуферизованное, оно все равно может быть неэффективным для интерфейса терминала, поскольку терминал часто выполняет собственную буферизацию.

См. Это для получения дополнительной информации: Должен ли я установить stdout и stdin для небуферизованного в C?

0 голосов
/ 01 июля 2018

какие функции?

  • getchar () - это функция, которая используется для получения одного символа из
    консоль.

putchar () - это функция, которая используется для возврата написанного символа как неподписанный символ, приведенный к int.

#include <stdio.h>
int main()
{
    int c;  
    while ( (c=getchar()) != EOF ){ 
        if (c >= 65 && c <= 90)
            c += 32;
        else if (c >= 97 &&c <= 122)
            c -= 32;
        putchar(c);
    }
  return 0;
}

c - это int, поэтому при чтении символа с клавиатуры он сохраняется как целое число, а не как символ. Оформить заказ ASCII.

т. Е. 65 = A, 90 = Z, 97 = a, 122 = z,

Вот что я понял из кода:

  1. создать переменную c для хранения нашего символа.
  2. получить символ от пользователя и сохранить его в c.
  3. , в то время как c не равно EOF (конец файла)
  4. , если c больше или равно 65 и c меньше или равно 90
  5. добавить 32 к c
  6. или, если c больше 97, а c меньше или равно 122
  7. минус 32 с
  8. вернуть значение c в символ и распечатать его.
...