我想在 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()
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
感谢您的上述回答。我已经找到了我想要的确切答案。我希望它也能帮助其他人的问题。
while ((ch == getchar()) != '$')
{
scanf("%c", &ch);
}