gpt4 book ai didi

c - 有没有办法动态设置从 fgets() 获得的字符串的大小?

转载 作者:行者123 更新时间:2023-11-30 14:43:53 29 4
gpt4 key购买 nike

我有一个变量 char *cmd,我想在其中存储来自 fgets() 的字符串。有没有办法使用 malloc 或类似的方法动态分配内存?或者我必须预先定义它的大小并在之后终止?之前,我将 cmd 的大小预定义为 100,但我试图找出出现段错误的位置。

char *cmd; 

fgets(cmd, n, stdin);

然后我尝试使用 strtok() 以空格作为分隔符来标记 cmd 字符串。

最佳答案

正如我在上面的评论中所说,这不是标准 C 的内置功能,尽管有一个 POSIX 函数可以完成您正在寻找的功能。如果您想自己动手,方法是动态分配(和重新分配)内存来存储从 fgets() 获得的结果。 。你可以知道什么时候fgets()到达行尾,因为它会突然到达文件末尾(在这种情况下它将返回 NULL ),或者因为它返回的最后一个字符将是换行符。

这是一个示例函数。请注意,我使用 strrchr()从缓冲区末尾向后搜索换行符。如果我们命中,我们一定要扔掉返回字符串中的换行符,并确保突破 while()循环,这样我们就不会调用 fgets()再次并开始获取下一行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// NOTE: dygetline() allocates memory! Do not disregard the return and
// remember to free() it when you're done!

#define BSZ 1024

char *dygetline(FILE * restrict stream) {
char *ret = NULL;
char *temp = NULL;
size_t retalloc = 1;
char buffer[BSZ];
size_t buflen = 0;
char *nlsrch;


while (NULL != fgets(buffer, BSZ, stream)) {
nlsrch = strrchr(buffer, '\n');

if (nlsrch) *nlsrch = '\0'; // Remove newline if exists

// Get the size of our read buffer and grow our return buffer
buflen = strlen(buffer);
temp = realloc(ret, retalloc + buflen);

if (NULL == temp) {
fprintf(stderr, "Memory allocation error in dygetline()!\n");
free(ret);
return NULL;
}

ret = temp; // Update return buffer pointer

strcpy((ret+retalloc-1), buffer); // Add read buffer to return buffer
retalloc = retalloc + buflen; // Housekeeping

if (nlsrch) break; // If we got a newline, stop
}

// If there was a file read error and fgets() never got anything, then
// ret will still be NULL, as it was initialized. If the file ended
// without a trailing newline, then ret will contain all characters it
// was able to get from the last line. Otherwise, it should be well-
// formed.

return ret;
}

关于c - 有没有办法动态设置从 fgets() 获得的字符串的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53688636/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com