在C中动态分配未指定大小的数组

时间:2013-05-17 07:04:13

标签: c arrays dynamic input char

我想在c中输入一个输入并且不知道数组大小。 请告诉我如何做到这一点..

hello this is
a sample
string to test.

3 个答案:

答案 0 :(得分:0)

malloc是一种方式:

char* const string = (char*)malloc(   NCharacters   ); // allocate it
...use string...
free(string); // free it

其中NCharacters是该数组中所需的字符数。

答案 1 :(得分:0)

如果您自己编写代码,则答案将涉及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()在'old'指针为空时重新分配内存的事实。如果您希望使用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

答案 2 :(得分:-1)

感谢您的上述答案。我找到了我想要的确切答案。我希望它也会帮助其他人的问题。

while ((ch == getchar()) != '$')
{
    scanf("%c", &ch);
}