[英]C Programming getting input
我如何不断获得用户输入(字符串),直到在C中按下输入就像C ++中的string
类一样?
我不知道输入大小所以我不能声明一个固定大小的变量,甚至我不能使用malloc()
或calloc()
动态分配内存。
有没有办法将其作为一个单独的函数来实现?
正如H2CO3所说,你应该用malloc()
分配一个缓冲区,然后每当它填满时用realloc()
调整它。 像这样:
size_t bufsize = 256;
size_t buf_used = 0;
int c;
char *buf = malloc(bufsize);
if (buf == NULL) { /* error handling here */ }
while ((c = fgetc(stdin)) != EOF) {
if (c == '\n') break;
if (buf_used == bufsize-1) {
bufsize *= 2;
buf = realloc(buf, bufsize);
if (buf == NULL) { /* error handling here */ }
}
buf[buf_used++] = c;
}
buf[buf_used] = '\0';
使用指数存储扩展:
char *read_a_line(void)
{
size_t alloc_size = LINE_MAX;
size_t len = 0;
char *buf = malloc(LINE_MAX); // should be good for most, euh, *lines*...
if (!buf)
abort();
int c;
while ((c = fgetc(stdin)) != '\n' && c != EOF) {
if (len >= alloc_size) {
alloc_size <<= 1;
char *tmp = realloc(buf, alloc_size);
if (!tmp)
abort(); // or whatever
buf = tmp;
}
buf[len++] = c;
}
if (len >= alloc_size) {
alloc_size++;
char *tmp = realloc(buf, alloc_size);
if (!tmp)
abort(); // or whatever
buf = tmp;
}
buf[len] = 0;
return buf;
}
在C中,你别无选择:如果你想输入一个无限长度的字符串,必须在循环中使用分配。 无论你使用realloc()
还是链接的缓冲区列表,它都归结为读取(通常通过fgets()
),读取更多,等等,直到你刚刚读取的缓冲区包含\\n
。
然后,根据方法,您要么已经有一个连续的缓冲区( realloc
方法),要么只需要将它们连接起来(链表方法)。 然后你就可以回来了。
如果您很幸运,您的平台附带了扩展函数getline()
,它为您执行realloc方法。 如果没有,你必须自己写。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.