繁体   English   中英

基于输入的动态字符串尺寸 C

[英]Dynamic string dimension C based on input

我想制作一个读取字符串的 C 程序,但它不需要数组的最大长度。

我试过这个,但它给了我一个错误:

#include<stdio.h>

int main(){
  char a[];
  scanf("%s",&a[]);
}

我可以根据数组输入放置数组的长度吗,也许使用类似length_of的东西?

我正要告诉你这是不可能的,因为当我意识到 C++ 提取器可以做到这一点(在std::string内)时,你需要一个分配数组来读入它。 这远非微不足道,并且需要您从任意分配的数组开始,并在需要更多空间时重新realloc它。

这可能是一个可能的代码,它读取任意大小的单词,直到第一个空格字符(或 EOF):

static char* resize(char* buf, size_t* size) {
    size_t new_size = *size * 2;
    if (new_size <= *size) { // size_t overflow
        free(buf);
        return NULL;
    }
    char* newbuf = realloc(buf, *size);
    if (!newbuf) {
        free(buf);
        return NULL;
    }
    return newbuf;
}

char* getWord(FILE* fd, size_t* size) {
    size_t len = 8, cur = 0;
    char* buf = malloc(len);
    if (!buf) return NULL;

    for (;;) {
        int c = fgetc(fd);
        if (c == EOF || isspace(c)) {
            break;
        }
        if (cur >= len) {
            if (!(buf = resize(buf, &len))) {
                return NULL;
            }
        }
        buf[cur++] = c;
    }
    if (cur >= len) {
        if (!(buf = resize(buf, &len))) {
            return NULL;
        }
    }
    buf[cur] = '\0';
    if (size) {
        *size = len;
    }
    return buf;
}

可以这样使用:

int main() {
    size_t sz;
    char* buf = getWord(stdin, &sz);
    printf("%s (%d)\n", buf, sz);
    return 0;
}

并且当恰好传递 8 个字符( abcdefgh )时,它会正确显示:

abcdefgh (16)

因为它为终止 null 分配了一个额外的 position。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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