質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

346閲覧

charの文字列でおかしな挙動

Ryuuse

総合スコア27

char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/06/06 09:39

編集2019/06/06 09:41

プログラミング初心者です。c言語のプログラミングで,性別と利き手を選択すると選択した内容を表示するプログラムを作っています。ソースコードは以下の通りです。

このソースコードでコンパイルは成功したのですが、実行してみると、1と3を選択した場合「you are Righty �U」と表示されてしまい、性別の表示がおかしくなっています。
charの文字列を G[10]、H[10]と二種類入れるとおかしくなってしまうような気がするのですが、原因がいまいち特定できません。
もし分かれば教えてください。よろしくお願いします。

#include<stdio.h>
int main()
{
int gender;
int hand;
do{
printf("please select your gender(Male:1, Female:2)\n");
scanf("%d",&gender);
}while(gender!=1 && gender!=2 );

do{
printf("Which is your dominant hand?(Right:3, Left:4\n)");
scanf("%d" ,&hand);
}while(hand!=3 && hand!=4);

char G[10];
char H[10];

if(gender==1){
char G[10]="Male";
}else if(gender==2){
char G[10]="Female";
}

if(hand==3){
char H[10]="Right";
}else if(hand==4){
char H[10]="Left";
}

printf("you are %sy ",H ); 
printf("%s.",G);

return 0;

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

char G[10];

char H[10];
if(gender==1){
char G[10]="Male";
}else if(gender==2){
char G[10]="Female";
}

if文の中でGを変数宣言してしまってるので、ifの上で宣言してるGとは別の変数となってしまってます
if文の中のGは、このif文を抜けると消滅します。そして、もともと宣言されてるGはなにも変わらずもとのママです

投稿2019/06/06 09:47

編集2019/06/06 09:48
y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryuuse

2019/06/06 09:54

それならばHにも同じことが言えますが、Hの場合はちゃんと入力された数字に対応した文字列を表示します。これはどういうことでしょうか。
y_waiwai

2019/06/06 10:00

Hも事情は一緒です たまたまそこの領域に入っているデータが表示されてるだけです if文の中は、 strcpy(G,"Male"); とかしておきましょう(他の場所も同様)
Ryuuse

2019/06/06 10:11

そんな仕様があったんですね... 理解しました
Ryuuse

2019/06/06 10:26

strcpy関数でif文中を書き換えましたが、なぜかGだけランダムなおかしい文字列になってしまいます ( 「V」や「vU」といった文字列に置き換わっています)。 constをつけた場合も試してみましたが、同様な結果になりました。
y_waiwai

2019/06/06 12:05

その修正済みのソースを提示しましょう。 言葉だけではどにもなりません
Ryuuse

2019/06/06 23:35

以下のようにソースコードを書き換えました。 if(gender==1){ const char G[10]="Male"; }else if(gender==2){ const char G[10]="Female"; if(hand==3){ const char H[10]="Right"; }else if(hand==4){ const char H[10]="Left"; }
Ryuuse

2019/06/06 23:41

もう一通りのソースコードにも書き換えました。(二行目に#include<string.h>を追加) if(gender==1){ char G[10]="Male"; strcpy(G,"Male"); }else if(gender==2){ char G[10]="Female"; strcpy(G,"Female"); } if(hand==3){ char H[10]="Right"; strcpy(H,"Right"); }else if(hand==4){ char H[10]="Left"; strcpy(H,"Left"); }
y_waiwai

2019/06/06 23:51

char G[10]; // 1 if(gender==1){ char G[10]="Male"; // 2 strcpy(G,"Male"); }else if(gender==2){ char G[10]="Female"; // 3 strcpy(G,"Female"); } printf(G); // 4 この、1,2,3の変数Gはみな別物です そして、{}の中で宣言された変数は、そのカッコを抜けると無効になります 4で出力されるGはどのGでしょうか。 答えは、1で宣言されてるGです。2,3のGはif文のカッコを抜けると捨てられます ということで、あなたの思うように動かそうとするなら、2,3の変数宣言はしてはいけません
Ryuuse

2019/06/07 00:12

if文中で変数宣言をすること自体がおかしな挙動を生み出す要因だったのですね。プログラムがうまく作動しました! 回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問