0

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

hello this is
a sample
string to test.
4

3 回答 3

0

malloc是一种方式:

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

其中NCharacters是您需要在该数组中的字符数。

于 2013-05-17T07:12:29.040 回答
0

如果您自己编写代码,答案将涉及malloc()and 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()此代码利用了当“旧”指针为空时重新分配内存的事实。如果您更喜欢使用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
于 2013-05-17T07:18:22.577 回答
-1

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

while ((ch == getchar()) != '$')
{
    scanf("%c", &ch);
}
于 2013-05-30T17:40:37.593 回答