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

0

Преобразование работает правильно, но когда я нажимаю кнопку ввода, когда его запрашивают в нижнем регистре, он выполняет ввод (\n) и не выходит или не останавливается.

Это моя программа:

#include <stdio.h>
#include <math.h>



main()
{
 char ch;
 printf("Press a letter: ");
 while (scanf(" %c",&ch)!='\n')
    {
        printf("%c\n",ch-32);     
    }


}
Теги:
scanf
enter

3 ответа

4

Ваша программа неверна:

  • scanf не возвращает символ, который был прочитан, он возвращает количество отсканированных элементов
  • Один из способов иметь дело с '\n' - проверить, if (ch == '\n') break;
  • Вам нужно проверить, действительно ли символ является буквой перед вычитанием 32
  • Вы должны использовать функцию toupper вместо прямого вычитания.
  • 0
    Мы предполагаем, что пользователь напишет строчную букву. Ну, мой профессор сказал нам, что мы можем использовать функцию прерывания, только если он позволяет, и в упражнении нет упоминания о разрыве. Другое условие состоит в том, что мы должны выполнять это без использования внешних функций, например, мой профессор не учил нас тапперам. Мы все еще в начале c (2 недели занятий)
  • 0
    @ user3397159 Затем можно использовать scanf("%c",&ch)==1 && ch != '\n' условие для вашего в while цикла.
Показать ещё 2 комментария
1

используйте этот код:

#include <stdio.h>
#include <math.h>        

    main()
    {
     char ch;
     printf("Press a letter: ");
     while (1)
        {
           scanf(" %c",&ch);
           if(ch=='\n')
               break;
           printf("%c\n",ch-32);     
        }
    }
  • 0
    scanf(" %c",&ch) никогда не установит ch на '\n' .
0

scanf(" %c",&ch) никогда не будет устанавливать ch в \n поскольку пространство в формате потребляет все пробелы, включая '\n' прежде чем перейти к "%c".

Кроме того, возвращаемое значение из scanf() равно EOF или числу успешно проанализированных аргументов, а не ch. (но не "%n")

Рассматривать:

#include <stdio.h>
// No need for #include <math.h>
#include <ctype.h>

int main() {
  int ch;  // use int
  printf("Press a letter: ");
  while ((ch = fgetc(stdin)) != EOF && (ch != '\n')) {
    printf("%c\n", toupper(ch));     
  }
  return 0; 
}

OP указывает в другом комментарии: "мы должны выполнять это без использования внешних функций, например, мой профессор не учил нас доверху". Пусть предполагается, что функции stdio в порядке, а ctype - нет.

  // Assume ASCII encoding

  while ((ch = fgetc(stdin)) != EOF && (ch != '\n')) {
    if ((ch >= 'a') && (ch <= 'z')) {
      ch += 'A' - 'a';
    }
    printf("%c\n", ch);     
  }

  // Not assuming ASCII encoding, but letters a-z, A-Z

  while ((ch = fgetc(stdin)) != EOF && (ch != '\n')) {
    static const char *az = "abcdefghijklmnopqrstuvwxyz";
    static const char *AZ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i;
    for (i=0; az[i]; i++) {
      if (ch == az[i]) {
        ch = AZ[i];
        break;
      }
    }
    printf("%c\n", ch);     
  }
  • 0
    это не работает.
  • 0
    Код исправлен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню