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