gpt4 book ai didi

c - 从函数返回的 char* 数组打印不正确的值(可能是内存管理)

转载 作者:行者123 更新时间:2023-11-30 19:04:53 25 4
gpt4 key购买 nike

我正在开发一个函数,该函数将逐行接收文件,并获取每一行,从中删除所有非十六进制的内容,然后返回非十六进制的空闲行。当我迭代文件的每一行时,我看到了预期值,并且该函数仅获取十六进制值,这正是我想要的。

但是,当我在主文件中打印 strippedLine 时,我在开头收到了一些意外的字符,并且丢失了最后一个数据字节。 (我对c和内存管理非常陌生)。

这是我的主要代码:

char currentLine[100];
char *strippedLine = NULL;

FILE *file = fopen("filename.txt", "r");

// Works as expected getting each line from file.
while(fgets(currentLine, sizeof(currentLine), file) != NULL)
{
// Change from original question
//strippedLine = (char *)malloc(1 + strlen(currentLine));
strippedLine = malloc(1 + strlen(currentLine));

// Change from original question
//strcpy(strippedLine, StripNonHex(currentLine));
strippedLine = StripNonHex(currentLine);


printf("%s", strippedLine);

}

这是我想返回一个删除所有十六进制的字符数组的函数:

char *StripNonHex(char *line)
{
char *nl = NULL;
char *token = NULL;
int convs = 0;
unsigned ch = '\0';
int hexLine = 0;
char *strippedLine = (char *) malloc(sizeof(char) * 256);
int counter = 0;

// Remove new-line char
if (nl)
{
*nl = '\0';
}
// Split each line into space-delimited tokens
token = strtok(line, " ");

convs = sscanf(token, "%x", &ch);

// Works as expected seeing each space delimited hex value of file.
while(token)
{
convs = sscanf(token, "%x", &ch);
if (convs == 1 && strlen(token) == 2)
{
hexLine = 1;
strippedLine[counter] = token;
}
counter += strlen(token);
token = strtok(NULL, " ");
// Removed from original question
//counter++;
}

// Removed from original question
//strippedLine[counter + 1] = '\0';

return strippedLine;
}
<小时/>

很抱歉缺少输入和输出。如下所示

输入

A5 12 00 24 00 01 22 00 3F 11    

输出

≡¡║A5120024000122003F

由于@Barmar 的建议,此输出更加接近。它只是缺少最后一个字节,并且开头有一些意外的字符。

我更新了我的问题,以便更了解我现在所拥有的内容。

<小时/>

if 语句内移动 counter += strlen(token); 是我的最后一个问题。无论我是否找到了我要找的东西,我都会无意中移动指针。

最佳答案

您没有正确地将 token 复制到 strippedLine 中。

strippedLine[counter] = token;

token中的指针转换为char,这是一个实现定义的转换,很可能只是取地址的低8位,并存储将值转换为 strippedLine[counter]。正确的做法是:

strcpy(&strippedLine[counter], token);

然后您需要将 counter 增加 token 的长度:

counter += strlen(token);

如果要将十六进制值扫描为unsigned char,则需要使用:

sscanf(token, "%hhx", &ch);

最后不需要 strippedLine[counter + 1] = '\0';,因为 strcpy() 会复制 null 终止符。

由于 StripNonHex() 返回新分配的字符串,因此无需对结果使用 strcpy()。只需直接将其分配给 strippedLine 而不是分配另一个字符串。

char *strippedLine = StripNonHex(currentLine);

完成该行后,您就可以使用free(strippedLine)

StripNonHex() 在分配其 strippedLine 变量时应使用 strlen(),而不是硬编码大小 256.

char *strippedLine = malloc(strlen(line) + 1);

关于c - 从函数返回的 char* 数组打印不正确的值(可能是内存管理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50977480/

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