cで入力を取りたいのですが、配列のサイズがわかりません。これを行う方法を教えてください..
hello this is
a sample
string to test.
malloc
一方向です:
char* const string = (char*)malloc( NCharacters ); // allocate it
...use string...
free(string); // free it
NCharacters
その配列に必要な文字数はどこにありますか。
自分でコードを書いている場合、答えにはmalloc()
とrealloc()
、そして多分strdup()
. 文字列 (行) を大きな文字配列に読み取ってから、文字列をstrdup()
動的にサイズ変更された文字ポインターの配列に (を使用して) コピーする必要があります。
char line[4096];
char **strings = 0;
size_t num_strings = 0;
size_t max_strings = 0;
while (fgets(line, sizeof(line), stdin) != 0)
{
if (num_strings >= max_strings)
{
size_t new_number = 2 * (max_strings + 1);
char **new_strings = realloc(strings, new_number * sizeof(char *));
if (new_strings == 0)
...memory allocation failed...handle error...
strings = new_strings;
max_strings = new_number;
}
strings[num_strings++] = strdup(line);
}
このループの後、 のための十分なスペースがありますが、使用されているのはmax_strings
だけnum_strings
です。成功したことを確認してstrdup()
、そこでメモリ割り当てエラーを処理することもできます。または、配列内の値にアクセスして問題を特定するまで待つこともできます。realloc()
このコードは、「古い」ポインタが null の場合にメモリを新たに割り当てるという事実を利用しています。初期割り当てに使用する場合malloc()
は、次を使用できます。
size_t num_strings = 0;
size_t max_strings = 2;
char **strings = malloc(max_strings * sizeof(char *));
if (strings == 0)
...handle out of memory condition...
自動的に持っていない場合はstrdup()
、独自のものを書くのは簡単です:
char *strdup(const char *str)
{
size_t length = strlen(str) + 1;
char *target = malloc(length);
if (target != 0)
memmove(target, str, length);
return target;
}
POSIX をサポートするシステムで作業している場合は、次のgetline()
ように簡単に使用できます。
char *buffer = 0;
size_t buflen = 0;
ssize_t length;
while ((length = getline(&buffer, &buflen, stdin)) != -1) // Not EOF!
{
…use string in buffer, which still has the newline…
}
free(buffer); // Avoid leaks