Изменения в массиве символов не видны с printf
Я пишу функцию C, которая меняет регистр между буквами: меняйте заглавные буквы на строчные и строчные. Код компилируется без ошибок, но ничего не печатает. Зачем?
#include<stdio.h>
#include<String.h>
void NOMB_car_chif(char a[])
{
int i;
for(i=0; i<strlen(a); i++){
if(a[i]>=65 && a[i]<=90)
a[i]=a[i]+32;
else
a[i]=a[i]-32;
printf("%s" ,a);
}
}
void main()
{
NOMB_car_chif("Welcome To My Word");
}
2 ответа
Вызов
NOMB_car_chif("Welcome To My Word");
передает строковый литерал в качестве аргумента, который при попытке изменения вызывает неопределенное поведение. Вам нужно передать указатель на изменяемое место в памяти, например, массив.
Тем не менее, операция преобразования глючит. else
part работает со всеми значениями вне кода ASCII для алфавитов UPPERCASE, а это не то, что вам нужно. Вам необходимо проверить диапазон строчных букв, а затем выполнить вычитание для преобразования в верхний регистр.
Напоследок пара предложений:
- Не используйте магические числа, такие как
65
а также90
, используйте соответствующие символьные константы сами, как'a'
,'z'
и т.п. - Для размещенных сред соответствующая подпись
main()
являетсяint main(void)
, по крайней мере.
#include<stdio.h>
#include<string.h>
void NOMB_car_chif(char a[1000])
{
int i=0,b=0;
for(i =0;i<strlen(a);i++)
{
if(a[i]>=65 && a[i]<=90)
b=a[i]+32;
else if(a[i]>=97&&a[i]<=122)
b=a[i]-32;
else
b=a[i];
printf("%c",b);
}
}
void main()
{
NOMB_car_chif("Welcome To My Word");
}
Решение вашей проблемы. Вы должны использовать%c вместо%s в вашем коде.