2016-05-10 8 views
0

"facebook"のような値の変数を持つことを試みています。しかし、私はそれをCで簡単にすることはできません。私はそれをしましたが、長すぎました。これは必要ありません。私は "123456789"のようなフロートで "facebook"を置き換えることができると思った。私のコードは、そのようなものです:私の単純なCプログラムがクラッシュする

printf("Enter the number.\n"); 

scanf("%f", website); 

if(website==32463774) 
{ 
    printf("You wrote facebook."); 
} 

プログラムは、印刷後、このscanfのラインに来るとき、それがクラッシュし、「番号を入力します。」。私は間違って何をしていますか?

+1

'のscanf( "%fを"、ウェブサイト);' - > 'のscanf( "%fを"、&ウェブ);'。 BTWは 'float'の代わりに' double'または 'long int'を使います。 – BLUEPIXY

+0

32463774はfloatではありません – user3078414

+3

1)コンパイラの警告を有効にする、2)関数のマニュアルを読む、3)関数の既存の使用例を探します。 –

答えて

1

scanf()は、変数自体ではなく、書き込む変数のアドレスをとります。ここで

が何をしたいです:ボンネットの下に

scanf("%f", &website); 

、アドレスおよび整数はほとんど同じです。それらは実装に基づいて異なりますが、終わりにはどちらも長さの数字です。長さは違うかもしれませんが、数字だけです。だからこそ、コンパイラはあなたに叫んでいません。あなたはおそらくこれをしたくないと知っていますが、それはあなたが何をやっているかを知っていることを信じていて、とにかくそれをやり遂げることを信じています。

アドレスは、メモリ内の何らかの場所です。 C関数は何かのアドレスを取得し、そこに行き、変更してから、呼び出し元の関数がそのアドレスに戻ることを可能にします(呼び出し元の関数は既に知っています)。ほとんどの新しい言語では、データを渡して戻すことで元の状態に戻すことができますが、Cはあまりそれをしたくないので、アドレスがあります。

壊れたレコードプレーヤー(変更したい変数)があるとします。より新しい言葉では、あなたは修理師(機能)を見に行き、彼にレコードプレーヤー(パラメータとして渡す)を与え、次に彼はあなたに固定レコードプレーヤーを与え、あなたは退去すると言うでしょう。 Cはレコードプレーヤー全体を拾うことはできません。 Cが運ぶことができるのは、その上に住所が記載されたPost-Itノートです。だから、Cがやっていることは、レコードプレーヤーが付箋の上にいる住所の修理士に行きます。修理士は家に帰ってレコードプレーヤーを修理し、電話を受けた人に戻ってきて、どうやって行ったのかを言う。レコードプレーヤーを入手するために、呼び出し元は家に戻ってそれを使用して固定します。

アドレスはアドレスで、レコードプレーヤーは変数の値です。 scanf()は住所を求めているので、その番号を家に入れて後でそれを入手することができます。あなたはそれに変数を与えました。あなたはそれをレコードプレーヤーに渡しました。修理師(機能)は付箋を期待しているので、レコードプレイヤーに書き込まれた住所をどこかで見つけようとします。彼はシリアル番号を見つけ、その住所を探して町を回って行く。もちろん、そのようなアドレスはありません。彼はただ永遠に見渡して、渇きで亡くなります。プログラムがクラッシュします。

短いストーリーは、scanf()にアドレスを付けます。

また、floatを使用する必要はありません。 intで十分です。

2

私はあなたのコードを試しましたが、私はあなたにそれのパターンを共有したと思います。

scanf("%f", &website); 

多分あなたのクラッシュしたプログラムの理由でした。 しかし、文字列をchar型の変数に簡単に格納できます。

ウェブサイト変数に文字列として値変数を格納しようとしました。

私のコードは次のようになります。

//The stored string 
char website[15]; 
printf("Enter the website:\n"); 
scanf("%s", website); 

printf("The stored website: %s\n", website); 
関連する問題