2012-01-31 10 views
1

私がDev-C++で次のコードをコンパイルすると、プログラムがうまく動作します。

Xcode 3.2.6でコンパイルすると、スクリーンショットのように見えます。
Xcodeでさまざまなコンパイラ設定を試みましたが、動作は変わりません。
これに関するアイデアですか?異なる動作xcodeとDev-C++

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    char artist[30]; 
    char album[30]; 
    int tracks; 
    char albumsingle; 
    float price; 

    printf("Please enter CD informations below. \n \n"); 

    printf("enter cd artist: "); 
    scanf("%[^\n]", artist); 

    printf("enter cd title: "); 
    fflush(stdin); 
    scanf("%[^\n]", album); 

    printf("enter no. of tracks: "); 
    fflush(stdin); 
    scanf("%d", &tracks); 

    printf("enter a for album s for single: "); 
    fflush(stdin); 
    scanf("%c", &albumsingle); 

    printf("enter price: "); 
    fflush(stdin); 
    scanf("%f", &price); 



    printf("\n\n\nartist: %s\n", artist); 
    printf("album: %s\n", album); 
    printf("track no.: %d\n", tracks); 
    if (albumsingle == 'a'){ 
     printf("cd type: album\n"); 
    } else { 
     printf("cd type: single\n"); 
    } 

    printf("price: %.2f EUR\n\n", price);         

    system("PAUSE"); 
    return 0; 
} 
+0

どのスクリーンショットを使用しますか?スクリーンショットを追加するのではなく、質問にエラーメッセージを追加するか、予想される出力と実際の出力を追加するだけです。 –

答えて

3
fflush(stdin); 

未定義の動作を引き起こし、ひいてはあなたのプログラムは、異なるコンパイラで異なる挙動を示しています。

リファレンスC標準:

int fflush(FILE *ostream); 

のostream点出力ストリームまたは最新の操作が入力されなかったことストリームが配信されるため、fflush関数は、任意の未書き込みデータを生じた更新ストリームにファイルに書き込まれるホスト環境に転送します。 この動作は未定義です。

+1

これは正解です。両方のコンパイラは、Cの標準に準拠しており、プログラムから未定義のビヘイビアが呼び出されたときに、どちらもランダムな結果を返すため、正しく動作するように見えます。また、[C FAQ](http://c-faq.com/stdio/stdinflush.html)も参照してください。 – Lundin

4

私の推測では、system("PAUSE");ステートメントと関係があると思います。 XcodeはOSX上で使用されます。これはUNIXの変形であり、コマンドはpauseではありません。

代わりに、代わりに手動でEnterキーを押すようにユーザーに依頼するのはなぜですか?このように:

printf("Press the ENTER key to continue.\n"); 
int c; 
do 
{ 
    c = fgetc(stdin); 
} while (c != '\n' && c != EOF); 

ほとんどのシステムで動作するという利点があります。

0

PAUSEはWindowsであり、Unixコマンドではありません。これはMacでは動作しません。最後にプログラムを一時停止したい場合は、代わりにgetchar()のようなものを使用してください。

0

ヘッダファイルConio.hを含め、画面を保持したいときはいつでもgetch()を使用してください。

関連する問題