【发布时间】:2016-10-28 17:41:17
【问题描述】:
这里我试图在一个字符串中找到一个子字符串,将子字符串反转并替换为原始字符串。如果我用 if 条件替换 while 循环,它适用于第一次出现。但我希望它适用于多次出现。 如果我在while循环中运行它(while(str = strstr(str,substr)),它会导致分段错误。我正在使用代码块IDE。 那么,如何更改代码以使其适用于多次出现?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *str = malloc(100);
char *sbstr = malloc(20);
int i=0,flag=1;;
printf("%s\n","Enter string");
gets(str);
printf("%s\n","Enter substring");
gets(sbstr);
/////////////////////////////////////////////////////////////
while(str = strstr(str,sbstr))
{
memcpy(str,strrev(sbstr),strlen(sbstr));
}
////////////////////////////////////////////////////
printf("%s",str);
return 0;
}
【问题讨论】:
-
当您使用
strncpy()时,它会在复制的字符串末尾添加一个空终止符。由于您要复制到源字符串中,因此您已将字符串截断到该点。 -
在我尝试深入研究您的代码之前,您是否已经通过 GDB 等调试器对其进行了调试? Valgrind 也是检查内存泄漏的有用工具。另外,一定要用
-Wall -Wextra编译。 -
使用
memcpy()而不是strncpy(),所以它不会添加空终止符。 -
另外,当你循环时,你应该在旧匹配之后开始新的搜索。否则,如果您正在搜索回文,则可能会出现无限循环,因为在您反转它后它将保持不变。
-
我可以看到您已通过编辑帖子中从
strncpy()到memcpy()的行来回复评论者的建议。 (在其他地方也是如此)不建议这样做,因为它会导致那些试图回答问题的人移动目标。只需通过其他评论确认您理解该评论,或者如果在答案中,如果有帮助,请向上单击答案。