Преобразование работает правильно, но когда я нажимаю клавишу ввода, когда его просят ввести нижний регистр, он выполняет ввод (\ 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
делает не возвращает прочитанный символ, возвращает количество отсканированных предметов'\n'
это проверить if (ch == '\n') break;
toupper
Функция вместо использования вычитания напрямую.используйте этот код:
#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);
}
}
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;
}
ОП заявляет в другом комментарии: «Мы должны выполнять это, не используя внешние функции, например, мой профессор не учил нас работать». Давайте предположим 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);
}