繁体   English   中英

C编程获取输入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM