C++正在混合我的字符串
C++ is mixing my strings?
我有一个自己编写的非常简单的c++函数
它应该只是从我的字符串中去掉"-"字符
这是代码
char* FastaManager::stripAlignment(char *seq, int seqLength){
char newSeq[seqLength];
int j=0;
for (int i=0; i<seqLength; i++) {
if (seq[i] != '-') {
newSeq[j++]=seq[i];
}
}
char *retSeq = (char*)malloc((--j)*sizeof(char));
for (int i=0; i<j; i++) {
retSeq[i]=newSeq[i];
}
retSeq[j+1]=' '; //WTF it keeps reading from memory without this
return retSeq;
}
我认为这一评论不言自明
我不知道为什么,但当我启动程序并打印出结果时,我会得到类似
的东西
'stripped_sequence''original_sequence'
然而,如果我试图调试代码以查看是否有任何错误,那么流会进行得很好,最终返回正确的剥离序列。
我试着打印出两个变量的内存,这是的内存读数
seq的内存:https://i.stack.imgur.com/dHI8k.png
*seq的内存:https://i.stack.imgur.com/UqVkX.png
retSeq的内存:https://i.stack.imgur.com/o9uvI.png
*retSeq的内存:https://i.stack.imgur.com/ioFsu.png
(由于垃圾邮件过滤器,无法包含链接/图片,抱歉)
这是我用来打印字符串的代码
for (int i=0; i<atoi(argv[2]); i++) {
char *seq;
if (usingStructure) {
seq = fm.generateSequenceWithStructure(structure);
}else{
seq = fm.generateSequenceFromProfile();
}
cout<<">Sequence "<<i+1<<": "<<seq<<endl;
}
现在,我真的不知道发生了什么。
如果可以使用std::string,只需执行以下操作:
std::string FastaManager::stripAlignment(const std::string& str)
{
std::string result(str);
result.erase(std::remove(result.begin(), result.end(), '-'), result.end());
return result;
}
这就是所谓的"抹除成语"。
这是因为您将C字符串的终止零放在分配的空间之外。您应该在字符串副本的末尾多分配一个字符,并在其中添加' '
。或者更好的是,您应该使用std::string
。
char *retSeq = (char*)malloc((j+1)*sizeof(char));
for (int i=0; i<j; i++) {
retSeq[i]=newSeq[i];
}
retSeq[j]=' ';
在没有的情况下,它一直在从内存中读取
这是经过设计的:C字符串以零结尾。CCD_ 4向C中的字符串例程发出已经到达字符串末尾的信号。当您使用C字符串时,C++中也有同样的约定。
就我个人而言,我认为你最好使用std::string
,除非你有非常好的理由:
std::string FastaManager::stripAlignment(std::string value)
{
value.erase(std::remove(value.begin(), value.end(), value.begin(), '-'), value.end());
return value;
}
当您使用C字符串时,您需要意识到它们是以null结尾的:C字符串到达找到的第一个null字符。在你发布的代码中,你引入了一个超出范围的赋值,因为你分配了"j"个元素,并分配给了字符串末尾两个字符后的retSeq[j + 1]
(当然你指的是retSeq[j] = 0;
)。
- 为什么我的字符串变量没有打印完整的字符串?
- 为什么在为其分配编号后无法显示我的字符串值?
- 我的字符串数组一次打印出前两个字符串
- 我的 c 字符串复制函数正在损坏其他变量的堆栈
- 如何修复我的字符串以避免运行时错误?
- 我的字符串类的 += 运算符有问题,它没有正确连接字符串
- c_str() 只读取了我的字符串的一半,为什么?我该如何解决这个问题?是字节问题吗?
- 我不知道为什么我的字符串无法保存值
- if 语句没有比较我的字符串 C++ 中的数值
- 为什么我的字符串在错误的位置打印
- 打印我的字符串阵列时,会遇到细分错误
- 登录系统C++:输入我的字符串User&Pass后,它要求我重新输入它们
- 我从我的字符串函数返回到主函数
- 随机字符串生成器不编辑我的字符串数组 (C++)
- 如何更快地擦除我的字符串
- 我的字符串队列结构有什么问题?
- 我如何显示我的字符串
- 为什么我的字符串令牌在我的C 野牛程序中最终减少时会获得新线
- 我的参数化构造函数说我的字符串变量未定义
- MySQL C ++连接器在我插入数据库时减少了我的字符串