2011-01-27 17 views
2

char配列を使用する前に宣言する必要がある場合は、入力を格納するためにchar配列を宣言する方法はありますか?Cでの文字列入力の処理

ユーザは、文または一連の単語を入力する。これはどのように操作されるように保存されていますか?

予想される入力を処理するのに十分な大きさの配列を宣言するのではなく、正しい方法は何ですか?

答えて

6

あなたはおよそコンソール入力を話している場合は、固定サイズのバッファを持っている以上FIXED_SIZEがあなたのバッファに格納することができない安全な機能を使用するしかありません。

例は次のようになります。

char buff[1024]; 
fgets(buff, 1024, stdin); // to read from standard input 

あなたは1023thを越えた文字は無視されることをユーザーに警告しなければなりません。バッファを介して

printf("%c", buff[strlen(buff)-1]); 
+0

ありがとうございました。それでは、どのように文字にアクセスするのですか?バフが1024でe。g最後の文字にアクセスしたい場合は、エスケープ文字を見つけるために配列を繰り返し処理する必要がありますか?ユーザーは10文字の文字列を入力しますか?ポインタを使用した場合はどうなりますか?例えばchar * word; scanfからwordを入力に設定します。どのように文字にアクセスするのですか? – jarryd

+0

回答を更新します。 –

+0

ありがとう。なぜ私はすべてがCで書かれている必要があるというこのアイデアを持っているのかわかりません:) – jarryd

1

入力:

あなたは最後の文字入力したユーザーにアクセスしたい場合は?私は通常使用

2

(あなたの代わりに文字の文字*を使用する必要があります[])

を(ユーザーのreallocを使用して、ターゲット配列のバッファがいっぱいになる、のprogrammの変化の大きさ、そのテキストはいくつかのサイズのバッファに書き込みます)機能以下:

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

#define OK  0 
#define NO_INPUT 1 
#define TOO_LONG 2 
static int getLine (char *prmpt, char *buff, size_t sz) { 
    int ch, extra; 

    // Get line with buffer overrun protection. 
    if (prmpt != NULL) { 
     printf ("%s", prmpt); 
     fflush (stdout); 
    } 
    if (fgets (buff, sz, stdin) == NULL) 
     return NO_INPUT; 

    // If it was too long, there'll be no newline. In that case, we flush 
    // to end of line so that excess doesn't affect the next call. 
    if (buff[strlen(buff)-1] != '\n') { 
     extra = 0; 
     while (((ch = getchar()) != '\n') && (ch != EOF)) 
      extra = 1; 
     return (extra == 1) ? TOO_LONG : OK; 
    } 

    // Otherwise remove newline and give string back to caller. 
    buff[strlen(buff)-1] = '\0'; 
    return OK; 
} 

それはあなたが入力した行が長すぎたかどうかを把握するためにいくつかのサポートコードでバッファオーバーフローセーフfgetsを使用しています。

もちろん、部分行を読み込んで任意のサイズの入力文字列を格納するためにメモリの再割り当てを行うことはできますが、通常は十分に大きな境界を設定して(例えば1Kと言うように)十分です。

私は実際にそのトリック(部分的な読み取りと再割り当て)を使用してユーザー入力を行っていますが、正直言って、その必要性は非常にまれで、私の「重要なソースコードスニペット」リポジトリには入りませんでした。

fgetsを使用すると、バッファオーバーフローが発生する可能性があります。これは、ユーザーに危険です。大きな入力です。

int main (void) { 
    int rc; 
    char buff[10]; 

    rc = getLine ("Enter string> ", buff, sizeof(buff)); 
    if (rc == NO_INPUT) { 
     printf ("No input\n"); 
     return 1; 
    } 

    if (rc == TOO_LONG) { 
     printf ("Input too long\n"); 
     return 1; 
    } 

    printf ("OK [%s]\n", buff); 

    return 0; 
} 

といくつかのサンプルの実行:あなたはそのコードをテストしたい場合は


、追加してみてください

pax> ./qq 
Enter string> hi bob 
OK [hi bob] 

pax> ./qq 
Enter string> 
No input 

pax> ./qq 
Enter string> hi ho the merry oh 
Input too long 

(つまり二番目のDCTRL入りました、ファイルのすぐ終わりです)。

関連する問題