- ベストアンサー
このプログラム見てもらえますか?
問題は十進数二桁の正整数をgetchar()を用いて文字型の変数xとyから元の10進二桁の正整数を復元して整数型変数zに格納せよ zをprintf()で出力し正しく格納されていることを格納せよ。です #include<stdio.h> int main(void) { char x[256],y[256]; int z; printf("整数を一文字入力して下さい。\n"); x=getchar(); printf("整数を一文字入力して下さい。\n"); y=getchar(); z=x*10+y; printf("%d\n",z); return(0); } これをコンパイルすると kadai5-5.c: In function `main': kadai5-5.c:9: incompatible types in assignment kadai5-5.c:11: incompatible types in assignment kadai5-5.c:12: `zyuu' undeclared (first use in this function) kadai5-5.c:12: (Each undeclared identifier is reported only once kadai5-5.c:12: for each function it appears in.) kadai5-5.c:13: `iti' undeclared (first use in this function) kadai5-5.c:14: invalid operands to binary + こう表示されます。 C言語の参考書片手に試行錯誤してるんですがなかなかできません。 よろしくおねがいします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
行番号つきでひとつずつ確認しましょう。 1: #include<stdio.h> 2: #include<stdlib.h> 3: int main(void); 4: int main(void) 5: { 6: char x[256],y[256]; 7: int z; 8: printf("整数を一文字入力して下さい。\n"); 9: x=getchar(); 10: printf("整数を一文字入力して下さい。\n"); 11: y=getchar(); 12: zyuu=atoi(x); 13: iti=atoi(y); 14: z=x+y; 15: printf("%d\n",z); 16: return(0); 17: } > kadai5-5.c: In function `main': > kadai5-5.c:9: incompatible types in assignment getcharの仮宣言は、int getchar(void )です。 xはchar x[100]と宣言されています。 この場合、xは配列の先頭アドレス(すなわち&(x[0]))です。であるため、x[0]に値を代入したい場合、x[0]としなければなりません。または、宣言をchar xとしてください。これなら、xは変数そのものになります。 > kadai5-5.c:11: incompatible types in assignment 上記xの問題と同じことをyでやってます。 > kadai5-5.c:12: `zyuu' undeclared (first use in this function) zyuuが宣言されていません。zyuuを使う場合は int zyuu;として宣言してください。 > kadai5-5.c:12: (Each undeclared identifier is reported only once > kadai5-5.c:12: for each function it appears in.) このエラーは上記のエラーの続きなので直せば一緒に消えます。 > kadai5-5.c:13: `iti' undeclared (first use in this function) itiが宣言されていません。 > kadai5-5.c:14: invalid operands to binary + せっかく計算したzyuuとitiを足すべきです。 これはタダの書き間違いですね? このプログラム、2つの方式が混ざってしまっています。 まずはzyuu,itiの変数宣言を追加してください。 次の方向は二つ。 1.atoiを使わない場合はx,yの宣言は配列をやめ、次のようにする。 zyuu=x-'0'; iti=y-'0'; とする。 2.atoiを使いたい場合、文字列として扱わなければならないため、x,yの宣言はそのままでよい。 9行目、11行目を次のようにする。 x[0]=getchar();x[1]='\0'; y[0]=getchar();y[1]='\0'; char配列を文字列として扱いたい場合、文字終端を正しくセットしておかなければなりません。 注意: getcharをはじめとするGETC系関数は、文字列ではなく文字そのものを取得します。文字配列に値を格納したい場合は、添え字([]演算子)を用意する必要があります。 fgetsとgetsのFGETS系関数は文字列を取得します。 この場合は、文字配列のアドレスを渡してそこにデータが格納されます。
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
1つの例 #include<stdio.h> #include<stdlib.h> int main(void){ char x,y; int z; printf("正整数を2文字入力して下さい。\n"); x=getchar();y=getchar(); z=(x-'0')*10+(y-'0'); printf("%d\n",z); return(0); }
お礼
この回答みるまで問題の意味間違ってました^^; ありがとうございました。 でも、z=(x-'0')*10+(y-'0'); ここの-0の意味がよくわかりません。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
気の付いたところを… int main(void);<いらない char x[256],y[256];<配列にする必要なし x=getchar();<バッファリングされてるかも・ zyuu=atoi(x);<atoiの引数はchar* z=x+y;<x*10してやらないといけない
- rits416
- ベストアンサー率0% (0/1)
質問者です プログラムの部分が間違ってました。 #include<stdio.h> #include<stdlib.h> int main(void); int main(void) { char x[256],y[256]; int z; printf("整数を一文字入力して下さい。\n"); x=getchar(); printf("整数を一文字入力して下さい。\n"); y=getchar(); zyuu=atoi(x); iti=atoi(y); z=x+y; printf("%d\n",z); return(0); } です すみませんでした
お礼
大変わかりやすく、すぐに理解できました。 ここでつまづくと後の授業ついていけなくなるんで助かりました~ 本当にありがとうございました~(TдT)