アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語初心者です。

printfで%sという書式があることを知りました。

入力した登場人物を文章中に入れてみたいと思ったのですが、

下記のソースではコンパイルエラーが出てしまいます。

間違ってる所を教えて欲しいです。それと大変図々しいのですが

組直して頂けると尚嬉しいと感じてる次第であります。



#include <stdio.h>

int main(void)

{

int p1,p2,yn;

puts;("当てはまる身近な人物の名前を入力してください。");
printf("男の人:"); scanf("%s", & p1);
printf("女の人:"); scanf("%s" ,& p2);

puts;("人物を入力できましたか?");
printf("y/n"); scanf("%s", &yn);

if (yn == y){
printf("僕は%sです。男だよ。",p1);
printf("そして私は%sです。女だよ。",p2);
}


return 0;


}




どうかこんな初心者のワタクシメに中級者、上級者様の有り難い回答を

どうぞ宜しくお願い致します。

A 回答 (3件)

ツッコミどころ満載ですな。



>puts;("当てはまる身近な人物の名前を入力してください。");

puts直後のセミコロンは要りません。

>scanf("%s", & p1);
>printf("僕は%sです。男だよ。",p1);

%sで必要なのはchar*であって、int型のアドレスではありません。
char*だからといって、
char *name;
scanf("%s", &name);
でいいわけでもありませんが。

>if (yn == y){
唐突に出て来た『変数y』が未宣言です。
まぁ何がやりたいのかは判りますが、手段が正しくありません。


全体的に…入門書をもう一度読まれる事をお勧めします。
# マラソンしようと思うけどハイハイすらできていない…って感じですかね。
    • good
    • 0

> 下記のソースではコンパイルエラーが出てしまいます。



こういうのが一番ダメです。

コンパイルエラーは、一番簡単なエラーです。
何が間違っているかのヒントを教えてくれています。
それを読まずに、解決などできません。

これは、上級者でも同じです。上級者だって、エラーが出れば、そのメッセージを読んで修正します。
プロでもやってることを、素人がやらなかったらそりゃ解決なんかできません。


たとえば、GCCでコンパイルすると、次のようなエラーメッセージが出ます。

XXXX.c:16:11: error: 'y' undeclared (first use in this function)

これは
「ファイルXXXX.cの16行目11文字目にエラー」
その内容は「 y (という変数か関数かなんか)が定義されていない(undeclared)」
ということです。WindowsでVisual Studio を使っているなら、
「error C2065: 'y' : 定義されていない識別子です。」等と出ているのでは。
https://msdn.microsoft.com/ja-jp/library/ewcf000 …

確かに、 y という変数は定義されていません。

では、 int y ; を追加すれば解決か、というとそうではありません。
たしかに、ここでのエラーは無くなります。
ですが、本来やりたいことでは無いので、プログラムは期待通りの動作はしません。
「文法は正しいが、やり方が間違っている」というのは、その間違いを探すのがとても困難です。
エラーになる方が何倍も楽です。

「この場所で何をするべきか」を考え、それに沿った記述に直しましょう。
ここでは、
上で入力した文字列 yn が 「文字列 "y"」と等しいか
を判断したいのでは?
""でくくらないと文字列にはなりません。

また、C言語では == を使って文字列を比較しても、「文字列の内容が同じ」とはなりません。

そもそも
int p1,p2,yn;
とint型で宣言した変数の文字列を入力して、printfで出力しようとしています。
C言語の仕様上、scanf,printfでは「エラー」にはなりません。
ですが、致命的な大間違いです。


思うに、本当にC言語を始めたばかりで、「文字列」については何も知らないように思います。
あせらずに、まずは参考書等の「文字列」についての内容を理解しましょう。


なお、他に次の間違いがあります
・puts の使い方が間違っている
・ ; が「全角」になっている箇所がある
    • good
    • 0
この回答へのお礼

文法の間違えを探すだけでは本来の解決にはならないのですね。お察しの通り文字列の知識がほとんどないです。もう少し文字列について調べ理想のソースができるようにしていきます。訂正とアドバイスありがとうございます!

お礼日時:2016/10/16 16:12

以下のようにしてください。


-----------------------------------
#include <stdio.h>

int main(void)

{

//int p1,p2,yn;
char p1[256]; //追加
char p2[256]; //追加
char yn[256]; //追加
puts;("当てはまる身近な人物の名前を入力してください。");
printf("男の人:"); scanf("%s", p1); //修正
printf("女の人:"); scanf("%s" ,p2); //修正

puts;("人物を入力できましたか?");
printf("y/n"); scanf("%s", yn); //修正

//if (yn == y){
if (strcmp(yn,"y")==0){ //修正
printf("僕は%sです。男だよ。",p1); //修正 全角の;を半角の;にする
printf("そして私は%sです。女だよ。",p2); //修正 全角の;を半角の;にする
}


return 0;


}
------------------------------------------------------
以下、実行結果です。
男の人:太郎
女の人:花子
y/ny
僕は太郎です。男だよ。そして私は花子です。女だよ。
--------------------------------------------------------
変更箇所は、//追加 //修正のようにコメントをいれています。
何故、そうなるか、わからないときは、再度、質問してください。
このプログラムの動作を確認するときは、提示されたソースをコピー&ペースト
して、それをコンパイルしてください。
(手打ちで入力すると、打ち間違いが発生し、エラーになる可能性があります)
    • good
    • 0

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