は私がユーザーから文字列を取得して動的に割り当てる方法はありますか?
char string[100];
gets(string);
を行うことができます知っているが、どのように私は動的に必ずしも100の長さではないかもしれません、その文字列に向かってメモリを割り当てることができますか?
は私がユーザーから文字列を取得して動的に割り当てる方法はありますか?
char string[100];
gets(string);
を行うことができます知っているが、どのように私は動的に必ずしも100の長さではないかもしれません、その文字列に向かってメモリを割り当てることができますか?
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;
}
は 'realloc'呼び出しを避けるためにNバイトの 'blocks'で実装できます –
@PierreEmmanuelLallemant;どうやって? – haccks
たとえば 'int block_size = 16;'と 'i%block_size == 0'の場合にのみreallocを呼び出します。 –
SOの目的は、既存のコード(またはアルゴリズム)の問題を解決することです。インターネットの目的は、そのようなコードを検索する場所を提供することです。 – KevinDTimm
事実1: 'gets'を使わないでください。長さがわからない文字列を扱う方法がなく、バッファーのオーバーフローを防ぐ方法がありません。目的2: 'malloc'を使って十分な大きさのバッファを作成し、次に' fgets'を呼び出して、実際に得た文字列のサイズまでバッファを縮小する 'realloc'を呼び出します。または、必要に応じてバッファを大きくし続けるために 'realloc'を使って、一度に1文字ずつ行を読むことができます。それを行う1つの方法は、ハックの答えに示されています。 –