c - 在 C 中操作字符串时非常相似的函数出错

标签 c c-strings

我正在学习 C,在处理字符串时遇到了一个问题。 在我正在解决的一个问题中,我应该编写一个函数来获取一个字符串和一个字符并删除所有出现的给定字符,然后我必须返回修改后的字符串。 我写的函数是这样的:

char *strdelc3(char *s, char ch){
for(int i=0,j=0; i!=strlen(s)+1; ++i)
 if(s[i]!=ch){
  s[j]=s[i];
  ++j;
 }
return s;
}

当我传递一个字符串和一个字符作为参数时:

main(){
char s[20]="mary";
puts(strdelc3(s,'r'));
}
The output is: Segmentation fault(core dumped),

根据我的研究,这意味着我正在访问不属于我的内存。 解决方案具有以下代码:

char *strdelc4(char *s, char ch){ /*Correct*/
int i,j;
for(i=0, j=0; s[i]!='\0'; ++i)
 if(s[i]!=ch){
  s[j]=s[i];
  ++j;
 }
s[j]='\0';
return s;
}

这基本上和我的一样,但是这件作品很好用! 由于这两个代码非常相似,所以我看不出有什么问题...... 我已经研究了两者,但我不明白我的问题是什么...有人可以帮忙吗?

最佳答案

问题出在你的循环条件中:

i!=strlen(s)+1

您试图在此处使用 strlen(s)+1 以避免必须添加空字节。但是在这样做时,strlen(s) 会在您移动终止空字节后发生变化。

在循环的前 4 次迭代中,strlen(s) 为 4。在下一次迭代中,i 为 4 且 strlen(s)+ 1 是 5 所以你再次进入循环。然后移动空字节。现在,在接下来的迭代中,strlen(s) 为 3,i 为 5。条件仍然为真,因此您继续前进,离开字符串的末尾。这会调用 undefined behavior在这种情况下会导致崩溃。

第二段代码通过根据 i 的索引显式查找空字节并在循环后将空字节附加到结果字符串来解决此问题。

关于c - 在 C 中操作字符串时非常相似的函数出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63928348/

相关文章:

c - 如何将结构用作指针和函数中的结构

c - 如何使用按位运算符实现模式 2^n-1

c++ - 打印给定字符串的 50% 或一半

c++ - 重新抛出具有相同消息的新异常会导致垃圾输出。为什么?

c - 如果在 atexit 处理程序中发生退出会怎样?

c - 让 fork 无限次执行等量的次数

c - 如何处理 n 个不同的 OpenMP 关键部分?

创建一个字符串数组并打印它

c++ - std::string::c_str() 结果的生命周期是多少?

c++ - 'memchr' 的冲突类型