2016-05-06 5 views
2

は私がユーザーから文字列を取得して動的に割り当てる方法はありますか?

char string[100]; 
gets(string); 

を行うことができます知っているが、どのように私は動的に必ずしも100の長さではないかもしれません、その文字列に向かってメモリを割り当てることができますか?

+2

SOの目的は、既存のコード(またはアルゴリズム)の問題を解決することです。インターネットの目的は、そのようなコードを検索する場所を提供することです。 – KevinDTimm

+0

事実1: 'gets'を使わないでください。長さがわからない文字列を扱う方法がなく、バッファーのオーバーフローを防ぐ方法がありません。目的2: 'malloc'を使って十分な大きさのバッファを作成し、次に' fgets'を呼び出して、実際に得た文字列のサイズまでバッファを縮小する 'realloc'を呼び出します。または、必要に応じてバッファを大きくし続けるために 'realloc'を使って、一度に1文字ずつ行を読むことができます。それを行う1つの方法は、ハックの答えに示されています。 –

答えて

0

reallocを使用すると、不明な長さの文字列を取得できます。入力された文字列を文字単位で読み取って'\n'またはEOFが見つかるまで毎回reallocを使用して、次の文字を読み取るためのメモリを割り当てます。

char *read_string(void) 
{ 
    int c; 
    int i = 0; 
    char *s = malloc(1); 
    printf("Enter a string: \t"); // It can be of any length 
    /* Read characters until found an EOF or newline character. */ 
    while((c = getchar()) != '\n' && c != EOF) 
    { 
     s[i++] = c; 
     s = realloc(s, i+1); // Add memory space for another character to be read. 
    } 
    s[i] = '\0'; // Nul terminate the string 
    return s; 
} 
+0

は 'realloc'呼び出しを避けるためにNバイトの 'blocks'で実装できます –

+0

@PierreEmmanuelLallemant;どうやって? – haccks

+0

たとえば 'int block_size = 16;'と 'i%block_size == 0'の場合にのみreallocを呼び出します。 –

関連する問題