Изменения в массиве символов не видны с 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 в вашем коде.

Другие вопросы по тегам