Преобразование работает правильно, но когда я нажимаю кнопку ввода, когда его запрашивают в нижнем регистре, он выполняет ввод (\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'
.
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);
}
scanf("%c",&ch)==1 && ch != '\n'
условие для вашего вwhile
цикла.