2011-12-04 36 views
4

次のscanf関数を無視するには、このような何かを言う:C文字列(char配列):ので、スペース

#include <stdio.h> 

void main() { 

    char fname[30]; 
    char lname[30]; 

    printf("Type first name:\n"); 
    scanf("%s", fname); 

    printf("Type last name:\n"); 
    scanf("%s", lname); 

    printf("Your name is: %s %s\n", fname, lname); 
} 

私はfnameため"asdas asdasdasd"を入力すると、それはもうlnameの入力何かに私に聞かないだろう。私はちょうど私がこれを解決できるか尋ねたい、ありがとう。

+0

scanf関数は空白の行ではなく1つの単語を読み込みます –

答えて

4

GNUを使用している場合は、fgets(またはgetline)を使用して、最初の空白の代わりに行全体を取得します。それはまたあなたのための改行文字を削除しますようideone

はまたthis answerから機能fgets_wrapperの使用を検討できます。

if (fgets(fname, 30, stdin) == NULL) { 
    // TODO: Read failed: handle this. 
} 

は、それがオンラインで作業を参照してください。フォーマットリストに%sを置く

+0

私はすでにこれを試しましたが、まだ動作しません – user974227

+2

@user 974227:それは*うまくいくでしょう、あなたはちょっと間違ったことをしました。あなたが試したことを示してください。 –

+0

このようなもの printf( "レベル%d \ n名前:"、私); fgets(tempName、32、stdin); printf( "\ nDescription:"); fgets(tempDesc、128、stdin); – user974227

5

空白が発見されるまで文字を読み取ることscanf()になります。入力文字列にはスペースが含まれているため、最初の文字はscanf()で、asdasとなります。またscanf()は危険であると考えられます(30文字以上入力するとどうなるか考えてください)。そのため他人の指摘どおりにfgets()を使用してください。ここで

は、あなたがそれを行うことができる方法である:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char fname[30]; 
    char lname[30]; 

    printf("Type first name:\n"); 
    fgets(fname, 30, stdin); 

    /* we should trim newline if there is one */ 
    if (fname[strlen(fname) - 1] == '\n') { 
     fname[strlen(fname) - 1] = '\0'; 
    } 

    printf("Type last name:\n"); 
    fgets(lname, 20, stdin); 
    /* again: we should trim newline if there is one */ 
    if (lname[strlen(lname) - 1] == '\n') { 
     lname[strlen(lname) - 1] = '\0'; 
    } 

    printf("Your name is: %s %s\n", fname, lname); 

    return 0; 
} 

コードのこの作品は、まだ完全ではありませんが。 fgets()に何らかのエラーが発生したかどうかを確認する必要があります。 fgets()hereを詳しく読んでください。

+0

私はこれも見ました!:)私のコードで試したところ、私の最初のscanfは無視されました – user974227

+0

@ user974227なぜ* scanf()*が必要ですか? 'fgets()'のみを使用してください。 – Beginner

+0

最初の入力は無視されました。私はすべてのscanfをfgetsに変更しました – user974227

1

変化

scanf("%s", fname); 

scanf("%[^\n]%*c", fname); 

[^ \ n]は( 'の\ n')

%の* Cは一つの文字を無視している 'の\ n' 以外の受け入れであります

+0

これは標準に属していますか? – Beginner

+0

はいそうです。 – BLUEPIXY

+0

gcc -std = c99 sample.cまたはgcc -std = c89 sample.c – BLUEPIXY