2012-03-13 20 views
-3

私はCプログラミングの新機能で、疑問を抱いています...私はCコードの特定のセグメントでエラーを見つけようとしてきました...そして、このセグメントはちょっと混乱していますので、ヘルプ...C printf乱数を印刷する

int main(void)  
{ 
    int myInt = 5; 
    printf("myInt = %d"); 
    return 0; 
} 

私の知る限り、このコードに間違いはありません。私は何を知りたいのですが、なぜこの声明は乱数を印刷しているのですか?

私が手出力が

myInt = 1252057154 

では、ヘルプをお願い申し上げます...おかげ

+5

があなたの 'のprintf()'自分自身を呼び出して尋ねるで詳しく見てみましょう、どのように印刷したい値どの知っているのですか? – FatalError

+0

は、プロトタイプの関連部分がドット:) 'int型のprintf(定数するchar * fmtは、...)である;' – pmg

+0

あなたがプログラミングを理解する必要がどのようなことは、コンピュータが魔法ないと、インテリジェントではないということです。 **あなたがそれを言うだけです**。 'myInt'を出力するよう' printf'に指示しないと、どの番号を印刷すると思いますか?あなたのプログラムに2つの 'int'があった場合、どちらを印刷するのですか? – Shahbaz

答えて

6

Cのプログラミングについて詳しくお読みください。

コンパイル時にすべての警告とデバッグを有効にする必要があります。 GCCの場合、これは少なくともgcc -Wall -Wextra -g(Linuxの場合)を意味します。

gcc -Wall -Wextra -g john.c -o john 

でコンパイルする場合

私は次の警告を取得しています:

john.c: In function ‘main’: 
john.c:4:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration] 
john.c:4:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default] 
john.c:4:5: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat] 
john.c:3:9: warning: unused variable ‘myInt’ [-Wunused-variable] 

ので補正が簡単です:警告なしでコンパイルさ

/* file john.c */ 
#include <stdio.h> 
int main(void)  
{ 
    int myInt = 5; 
    printf("myInt = %d\n", myInt); 
    return 0; 
} 

printfフォーマット文字列の末尾に\nがあることに注意してください。大事です。

常にコンパイラがあなたにを与えることができるすべての警告を有効にし、コンパイラを信頼するので、警告が表示されなくなるまでコードを修正してください。

デバッガ(Linuxではgdbなど)を使用する方法を学ぶ。

あなたが観察された行動は、未定義の動作です。 何かは、標準準拠の実装C(爆発の場合もあります)で発生する可能性があります。

ハッピーハッキング。

2

それはこのようになります。あなたは変数が含まれていない場合は、その後、

printf("myInt = %d",myInt); 

基本的にメモリのランダムなチャンクを引っ張ります。さらに、より大きいコードのチャンクでこれを行うと、より厄介なものが発生する可能性があります。 printfステートメントから必要な数の変数があることを常に確認してください。そうしないと、結果が悪くなります。

0
int main(void)  
{ 
    int myInt = 5; 
    printf("myInt = %d",myInt); 
    return 0; 
} 

あなたは変数は、それが唯一のprintf()関数に渡すことで表示することができ、いくつかの値が割り当てられているend.Wheneverで見た場合、コードの変化だけではprintf文でミン変数をIに追加されます

printf("myInt = %d"); 

あなたが合格すると予想している引数:対応するタイプはC.

+0

初心者の方にはいいですが、説明がありません! –

2

まあでルールをspecifier.Itsと、それは間違って何かを印刷するなら、問題はprintfコールにありますか?

3

printf(同様のscanf)は次のように機能します。

のは、あなたがprintf

printf("%d some text %f %u %hu some more text\n", arg1, arg2, arg3, arg4) 

printfへの呼び出しを発行するとしましょうは?

に基づいて、フォーマット文字列の上に行き、引数で %?を置き換えます今
%d some text %f %u %hu some more text 
|   | | | 
arg1  arg2 | arg4 
       arg3 

Aの可変数を取る機能があるものrgumentsは、引数が存在するかどうかわからないため、フォーマット文字列に基づいてスタックの特定の部分からデータを取得するだけです。あなたが書く場合:

printf("%d %f %u\n"); 

それは、関数の呼び出し時(あなたから隠されるべき値)

0

printf関数が受け取る関数であるおそらく値が格納されます、スタックから3個の非既存のデータを読み込み、 1つ以上の引数。 は、あなたのケースでは、唯一の(法的である)引数ではなく、%dの第二引数を取るように指示しますprintfの引数containesの%dを受けました。 printf関数は、スタックから「第2引数」とり、一つだけ引数をスタック(文字列)に押されたので、2番目の引数としてリターンアドレスを使用します。