Преобразование букв нижнего/верхнего регистра без ctype.h

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

#include <stdio.h>
 main()
{
char name[22];
int i;

fputs("Type your name ",stdout);
fgets(name,22,stdin);


for (i = 0; name[i] != '\0'; i = i + 1)
printf("%c",(name[i])-32);  /*This will convert lower case to upper */
                            /* using as reference the ASCII table*/   
fflush(stdin);
getchar();
} 

person Yudop    schedule 13.11.2012    source источник


Ответы (1)


Возможно, в конце строки есть символ разрыва строки.

Вы можете проверить код символа, чтобы преобразовать только символы, которые на самом деле являются буквами нижнего регистра:

for (i = 0; name[i] != '\0'; i = i + 1) {
  char c = name[i];
  if (c => 97 && c <= 122) {
    c -= 32;
  }
  printf("%c", c);
}
person Guffa    schedule 13.11.2012
comment
Спасибо, это определенно решение, и в качестве другой альтернативы я вспомнил, что fgets() получает из ввода новую строку после того, как я закончу вводить имя, я должен был добавить эту следующую строку после fgets() name[strlen(name)-1] = '\0'; Таким образом, он может удалить новую строку, которую я набираю при преобразовании, и принимает ее как нуль. - person Yudop; 14.11.2012
comment
Я знаю, что этот вопрос старый; однако я хотел бы заставить всех использовать unsigned char в таких операциях, поскольку на некоторых платформах символ может быть подписан. - person ghostmansd; 11.04.2014