有没有办法动态使用 fgets 大小
is there a way to use fgets size dynamically
所以我正在学习指针和动态内存以及如何试验 fgets。
所以我想使用 fgets 将字符串输入输入到指针中,但是我希望 fgets 的大小通过我用于指针的 malloc 函数动态变化,有没有办法做到这一点?
例如
int main(){
char *text;
text =(char *)malloc(200 * sizeof(char));
fgets(text, n, stdin);
return 0;
}
说明
- 我创建了一个名为 'text' 的字符指针来最终存储字符串。
- 然后我用malloc 计划存储200个字符
- 接下来我想用fgets来接收用户输入的字符串
其中 'n' 是 malloc 为指针分配的文本大小?
我已经试过了fgets(text, sizeof(text), stdin);
但是还是不行?
这是行不通的,因为 sizeof(ptr)
其中 ptr 是一个指向 char 数组的动态指针,它将始终是指针的大小(64 位机器为 8),而不是数组的大小。你必须:
- 或者将 200 存储在某种变量中;或者
- 为文本静态分配内存,如
char text[200];
一种常见的方法是分配一些上限大小的缓冲区,然后 right-size 它。
char *fgets_alloc(FILE *f, size_t max_size) {
char *buf = malloc(max_size);
if (buf) {
if (fgets(buf, max_size, f)) {
size_t sz = strlen(buf) + 1;
void *ptr = realloc(buf, sz); // Reduce allocation
if (ptr) {
buf = ptr;
}
return buf;
}
free(buf);
}
return NULL;
}
待办事项:处理过长行和 max_size
超出 int
范围的代码。
所以我正在学习指针和动态内存以及如何试验 fgets。
所以我想使用 fgets 将字符串输入输入到指针中,但是我希望 fgets 的大小通过我用于指针的 malloc 函数动态变化,有没有办法做到这一点? 例如
int main(){
char *text;
text =(char *)malloc(200 * sizeof(char));
fgets(text, n, stdin);
return 0;
}
说明
- 我创建了一个名为 'text' 的字符指针来最终存储字符串。
- 然后我用malloc 计划存储200个字符
- 接下来我想用fgets来接收用户输入的字符串 其中 'n' 是 malloc 为指针分配的文本大小?
我已经试过了fgets(text, sizeof(text), stdin);
但是还是不行?
这是行不通的,因为 sizeof(ptr)
其中 ptr 是一个指向 char 数组的动态指针,它将始终是指针的大小(64 位机器为 8),而不是数组的大小。你必须:
- 或者将 200 存储在某种变量中;或者
- 为文本静态分配内存,如
char text[200];
一种常见的方法是分配一些上限大小的缓冲区,然后 right-size 它。
char *fgets_alloc(FILE *f, size_t max_size) {
char *buf = malloc(max_size);
if (buf) {
if (fgets(buf, max_size, f)) {
size_t sz = strlen(buf) + 1;
void *ptr = realloc(buf, sz); // Reduce allocation
if (ptr) {
buf = ptr;
}
return buf;
}
free(buf);
}
return NULL;
}
待办事项:处理过长行和 max_size
超出 int
范围的代码。