2017-04-19 7 views
-1

大文字を小文字に変更し、小文字を大文字に変更するC関数を書いています。コードはエラーなしでコンパイルされますが、何も印刷されません。どうして?文字配列の変更がprintfで見えない

#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"); 
} 
+3

」は、「」である必要があります。 'void main'は' int main'です。文字列リテラルの文字は変更できません。 – aschepler

+1

未定義の動作です。 'void main'で始まるプログラムで何かが起こる可能性があります。 –

+1

@AnttiHaapala ...実装がまれにしかサポートしていない場合 –

答えて

1

コール

NOMB_car_chif("Welcome To My Word"); 

を変更することを試みた場合、引数としてリテラル文字列を渡し、undefined behaviorを引き起こします。変更可能なメモリ位置(たとえば配列)へのポインタを渡す必要があります。

つまり、変換操作はバグです。 elseの部分は、のためにすべて 大文字のASCIIコードの外の値はあなたが望むものではありません。小文字アルファベットの範囲を確認し、大文字に変換するために減算を実行する必要があります。

最後に、提案のカップル:

  • は、'a'のように、対応する文字が自分自身を定数ホステッド環境の場合など'z'
  • 、準拠した署名を使用し、6590のような魔法の数字を使用しないでくださいmain()の値は、少なくともint main(void)です。問題の
0
#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"); 
} 

ソリューション。 コードで%sの代わりに%cを使用する必要があります。

関連する問題