2017-12-14 9 views
-1

複数のprintfsを入力したいが、入力する機会がない。 私は唯一の1を入力することができますが、それだけでprogramme.Iをしてみました終わることの後にそれが仕事didntの間、複数の文字を入力してスキャンする方法

int main() 
{ 
    int number; 
    char username[30]=""; 
    char fullName[30]=""; 
    char password[30]=""; 
    printf("Do you want to log in(1) or register (2)? \n"); 
    scanf("%d",&number); 
    if (number==2) 
    { 
    printf("username : "); 
    scanf("%s",&username); 
    printf("Full name : "); 
    scanf("%s",&fullName); 
    printf("Password : "); 
    scanf("%s",&password); 
    printf("Repeat password : "); 
    scanf("%s",&password); 
    } 
    return 0; 
} 
+0

使用されたサンプル入力をポストします。 – chux

+0

データを印刷/保存しないと、コード化されているかどうかをどのように知ることができますか? – chux

+1

1を入力すると 'if'文は実行されません(' number'は1になり、 'number == 2'はfalseです)。当然のことながら、あなたのプログラムは、 'return'である 'if'ブロックの終わりにまっすぐ進み、終了します。 – Scadge

答えて

1

は、そのを解析し、適切な大きさのバッファにfgets()を使用して完全なラインをお読みください。

%sは最初の空白文字で止まるので、 "Mr X"のフルネームは入力バッファに "X"を残し、パスワードなどを取得します。それは本当に入力を得る堅牢な方法ではありません。

0

cライブラリ関数fgets()を使用します。

#include <stdio.h> 
int main(){ 
    Char username[10]; 
    printf(“Username: “); 
    fgets(username,10,stdin); 
} 
+0

ちょっとした提案[get関数はなぜ危険なので、使用しないのですか?](https://stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it -should-be-used) –

+0

ああ、代わりにfgets()を使用してください。 gets()関数は、入力されたデータを無制限に読み込み、それをバッファーを超えて格納します。それはあなたのコンピュータを壊すことができます。 –

+1

'gets()'は使用しないでください。これはC99で廃止され、C11から完全に削除されました。この危険な機能の使用を提案することさえしないでください。 –

1

私は唯一の1を入力することができますが、その後、それだけで、プログラムを終了します。もちろん

あなたが"2"を入力すると、コードがif (number==2)@Scadge

を持っているとして、次の点を考慮してください


scanf("%s",&fullname);fullnameにスペースやその他のホワイトスペースは保存されません。 「John Doe」のような氏名を入力すると、"John"fullnameに、"Doe"passwordに保存されます。

scanf()を避けてください。


よりもむしろfgets()でユーザ入力を読み取り、ユーザ入力を読み取るためにscanf()を使用します。これは、さまざまな入力問題を処理できるヘルパー関数にとって素晴らしい機会です。

さて、

// printf("Do you want to log in(1) or register (2)? \n"); 
// scanf("%d",&number); 
number = read_int("Do you want to log in(1) or register (2)? \n"); 

... 

// printf("username : "); 
// scanf("%s",&username); 
read_line(username, sizeof username, "username : "); 
// printf("Full name : "); 
// scanf("%s",&fullName); 
read_line(fullName, sizeof fullName, "fullName : "); 

追加のコードは、ファイルの終わりのための非常に長い行をチェックするために追加することができたきれいなユーザ入力をintレンジのテストをこれら2つのヘルパー関数を使用し

int read_int(const char *prompt) { 
    if (prompt) fputs(prompt, stdout); 
    fflush(stdout); // insure output is written before asking for input 

    char buffer[40]; 
    if (fgets(buffer, sizeof buffer, stdin) == NULL) { 
    return NULL; 
    } 

    int i; 
    if (sscanf(buffer, "%d", &i) == 1) { 
    return i; 
    } 

    // TBD - what should code do if invalid data entered. Try again? 
} 

char *read_line(char *dest, sizeof size, const char *prompt) { 
    if (prompt) fputs(prompt, stdout); 
    fflush(stdout); // insure output is written before asking for input 

    char buffer[size * 2 + 1]; // form buffer at _least 1 larger for \n 
    if (fgets(buffer, sizeof buffer, stdin) == NULL) { 
    return NULL; 
    } 

    size_t len = strlen(buffer); 
    if (len > 0 && buffer[len-1] == '\n') buffer[--len] = '\0'; 

    if (len >= size) { 
    // input too big - how do you want to handle this? 
    TBD_Code(); 
    } 
    return strcpy(dest, buffer); 
} 

など