我想在c中输入一个输入并且不知道数组大小。 请告诉我如何做到这一点..
hello this is
a sample
string to test.
答案 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);
}