プロが教えるわが家の防犯対策術!

問題は十進数二桁の正整数を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言語の参考書片手に試行錯誤してるんですがなかなかできません。
よろしくおねがいします。

A 回答 (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系関数は文字列を取得します。
この場合は、文字配列のアドレスを渡してそこにデータが格納されます。
    • good
    • 0
この回答へのお礼

大変わかりやすく、すぐに理解できました。
ここでつまづくと後の授業ついていけなくなるんで助かりました~
本当にありがとうございました~(TдT)

お礼日時:2005/05/22 01:09

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);
}
    • good
    • 0
この回答へのお礼

この回答みるまで問題の意味間違ってました^^;
ありがとうございました。

でも、z=(x-'0')*10+(y-'0');
ここの-0の意味がよくわかりません。

お礼日時:2005/05/21 16:18

気の付いたところを…



int main(void);<いらない
char x[256],y[256];<配列にする必要なし
x=getchar();<バッファリングされてるかも・
zyuu=atoi(x);<atoiの引数はchar*
z=x+y;<x*10してやらないといけない
    • good
    • 0

質問者です


プログラムの部分が間違ってました。
#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);
}
です すみませんでした
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!