gpt4 book ai didi

c - memset() 没有在 c 中设置内存

转载 作者:行者123 更新时间:2023-12-02 10:39:05 25 4
gpt4 key购买 nike

如果我的格式不正确,我深表歉意,因为这是我的第一篇文章,我在网站上找不到处理我遇到的相同问题的帖子。我在 ubuntu 12.04 服务器上使用纯 C。我正在尝试将多个字符串连接在一起形成一个字符串,并用 N 分隔。然而,字符串大小和字符串之间的间距可能会有所不同。创建了一个结构来将位置数据存储为多个可以传递给多个函数的整数:

typedef struct pseuInts {  
int pseuStartPos;
int pseuPos;
int posDiff;
int scafStartPos;
} pseuInts;

以及字符串结构:

typedef struct string {  
char *str;
int len;
} myString;

由于连接字符串存在中断条件,因此组装了动态链接列表的多个节点,其中包含标识符和连接字符串:

typedef struct entry {  
myString title;
myString seq;
struct entry *next;
} entry;

memset调用如下:

} else if ((*pseuInts)->pseuPos != (*pseuInts)->scafStartPos) {  
(*pseuEntry)->seq.str = realloc ((*pseuEntry)->seq.str, (((*pseuEntry)->seq.len) + (((*pseuInts)->scafStartPos) - ((*pseuInts)->pseuPos)))); //realloc the string being extended to account for the Ns
memset (((*pseuEntry)->seq.str + ((*pseuEntry)->seq.len)), 'N', (((*pseuInts)->scafStartPos) - ((*pseuInts)->pseuPos))); //insert the correct number of Ns
(*pseuEntry)->seq.len += (((*pseuInts)->scafStartPos) - ((*pseuInts)->pseuPos)); //Update the length of the now extended string
(*pseuInts)->pseuPos += (((*pseuInts)->scafStartPos) - ((*pseuInts)->pseuPos)); //update the position values
}

如果决策是在由 main 调用的函数调用的函数中,则这些都将被取消引用,但 pseuEntry 结构的更改需要在 main 中更新,以便传递给另一个函数进行进一步处理.
我通过插入一些 printf 命令仔细检查了 pseuInts 中使用的数字,它们在需要添加多少 N 的位置上是正确的,即使它们在不同的短字符串之间发生变化。然而,当程序运行时,memset 仅在第一次调用时插入 Ns。 IE:

GATTGT 和 TAATTTGACT 由 4 个空格分隔,它们变为:
GATTGTNNNNTAATTTGACT

第二次在同一个连接字符串上调用它时,它不起作用。即:
TAATTTGACT 和 TCTCC 由 6 个空格分隔,因此长字符串应变为:

GATTGTNNNNTAATTTGACTNNNNNNTCTCCC
但它只显示:
GATTGTNNNNTAATTTGACTTCTCC

我添加了 printfs 来显示 memset 之前和之后的连接字符串,并且它们在输出中是相同的。
有时插入会添加额外的字符空间,但不会初始化它们,因此它们会打印无意义的内容(如预期的那样)。浏览器:

GAATAAANNNNNNNNNNNNNNNNN-GCTAATG
应该是
GAATAAANNNNNNNNNNNNNNNNNGCTAATG

我用 for 或 while 循环切换了 memset,得到了相同的结果。我使用中间 char * 来重新分配,但仍然得到相同的结果。我正在寻找有关我应该在哪里尝试检测错误的建议。

最佳答案

如果您愿意考虑完全不同的方法,我想提供以下建议:

我理解您的意图是:用相等数量的“N”替换两个字符串之间的现有空格。 memset()(以及相关的内存分配)是执行串联的主要方法。

您所描述的当前串联尝试的问题是:
1) 结果字符串中嵌入了垃圾。
2)在一些非预期的内存位置写入“N”。
3)“N”未写入其他预期内存位置。

不同的方法:

首先:验证分配给正在修改的字符串的内存是否足以包含结果
第二:在尝试串联之前验证所有要串联的字符串是否已以 \0 终止。
第三:使用strcat()for(;;)循环来附加所有“N” ,以及最终的后续字符串。

例如

for(i=0;i<numNs;i++)//compute numNs with your existing variables 
{
strcat(firstStr, "N");//Note: "N" is already NULL term. , and strcat() also ensures null term.
}
strcat(firstStr, lastStr); //a null terminated concatenation

我知道这种方法与您所做的有很大不同,但它至少解决了您的问题陈述中确定的问题。如果这没有意义,请告诉我,我将尽力解决问题。 (目前还有其他项目正在进行中)

关于c - memset() 没有在 c 中设置内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20203065/

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