2016-06-21 9 views
0

最初に文字列値を読み、その後にint値を読み取ると機能します。 getsは同じ行の複数の単語を読むことができるので、scanfの代わりに関数getsを使用しようとしました。"gets"関数を使用して読み取られた文字列を印刷できません

fgetsでも試しましたが、同じ問題があります。

私はCygwinの32ビットコンパイラバージョン2.874を使用しています。私はcodeblocks ide 13.12を使用しています。

scanf(" %s", s); // here the space will emit the previous newline or space 

以上のバッファのサイズへの入力を制限するであろうfgetsを使用する:あなたが入力した整数は、scanfでこれをしようとすると、

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

int main() { 
    int i; 
    char s[10]; 

    printf("Value int:\n"); 
    scanf("%d",&i); 
    printf("%d\n",i); 

    printf("Value string:"); 
    fflush(stdin); 
    gets(s); 
    printf("%s\n",s); 

    getchar(); 
    return 0; 
} 
+1

getを使用しないでください。代わりにfgets ==> fgets(s、10、stdin)を使用してください。またはscanf ==> scanf( "%9s"、s); – Michi

+1

http://stackoverflow.com/questions/5240789/scanf-leaves-the-new-line-char-in-bufferおよびhttp://stackoverflow.com/questions/3555108/multiple-word-string-input- – NPE

+0

'gets'は標準的ではありません(それ以上)、すべてのツールチェーンはあなたにそれを使って叫ぶべきです。 **決して**これを使用しないでください! 'fflush(stdin)'は未定義の動作を呼び出します。また、それを使用しないでください! – Olaf

答えて

2

scanfを呼び出した後、改行が入力バッファーに残ります。したがって、getsと呼ぶと、その改行だけが取得されます。

fflush(stdin)は、C標準に従って定義されていない動作ですが、MSVCはこれを拡張機能としてサポートしています。代わりにgetcharを使用して、バッファから改行を読み取る必要があります。

+0

'getchar'を呼び出した後に 'scanf'を呼び出す前に 'gets'を呼び出すことは非常に便利でした。 ありがとうございました! – rjcdz04

+0

私はあなたのアドバイスに従ったので、私はfgetsを使用しました。 printf( "値のint:\ n"); のscanf( "%d個"、&i); のprintf( "%d個の\ n" は、I); getchar関数(); //この行は非常に有用であった のprintf( "値文字列:"); fgetsの(S、 sizeof s、stdin); printf( "%s \ n"、s); もう一度ありがとうございます。 – rjcdz04

0

第2の入力は、新しい行がかかります。

fgets(s, sizeof s, stdin); 

はまた、getsを使用していない、それは危険とバッファオーバーフローされることがあります。 fflushstdinにコールしないでください。stdinは入力ストリームですが、それは未定義の動作です。

+1

'gets'は推奨されていませんが、C標準ライブラリの一部ではありません。 – Olaf

+0

@OlafそれはC89とC99の一部であり、C11で削除されました。 – fluter

+0

私が言ったように:それは標準ライブラリの一部ではありません。 C89はISO/IEC規格ではなく、C90であり、C90もC89もC規格ではない。それはC11だけです。 C99とC11の文書(または自由に入手可能な最終草案)の頭文字を参照してください。 – Olaf

関連する問題