学习C++,代码是字符串替换的练习, 其中while循环中的表达式
p = strstr(p, sub) != NULL 执行到这里会报错,
如果把这句话改成 ( (p = strstr(p,sub) ) != NULL 先执行左边就没有问题,
感觉好像是先执行的右边,不明白的是strstr(p,sub) != NULL 这句为什么会报错... ...
使用的Visual Studio 2017编译器什么的都是默认配置没有改过,
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// ↓这里用了二级指针
int replaceSubstr(char *src,char **dst,char *sub, char *new_sub)
{
char *out = NULL;
char *p = NULL;
char *q = NULL;
int sub_len = 0;
int new_sub_len = 0;
if (src == NULL || dst == NULL || new_sub == NULL) {
fprintf(stderr, "src == NULL || dst == NULL || new_sub == NULL");
return -1;
}
out = (char *)malloc(sizeof(char *) * 4096); //在堆上分配4096 * char*个长度的空间
if (out == NULL)
{
fprintf(stderr, "malloc out error\n");
return -1;
}
memset(out, 0, 4096); //给4096字节的堆空间填充空值
p = src; // p指向字符串开头
q = p; // q指向字符串开头
sub_len = strlen(sub); // 被替换的字符串长度
new_sub_len = strlen(new_sub); // 要替换的字符串长度
while ( p = strstr(p, sub) != NULL) { // 如果strstr不为空
// 找到了字串
//q是最开始的指针位置 p-q是到第二个sub之间的字符串长度
strncat(out, q, p - q); //给out赋值
strncat(out, new_sub, new_sub_len); //然后把新sub替换上去
p += sub_len; // p指针增长长度
q = p; //q指向新的开始位置
if (*p == '\0') { // 如果*p的指针是0 那么退出循环
break;
}
}
if (*q != '\0') {
strncat(out, q,( src + strlen(src) - q ));
}
*dst = out;
//free();
return 0;
}
int main(void)
{
char *str = "213abcd123231abcd213321asdabcd123214abcd";
char *dst = NULL;
replaceSubstr(str,&dst,"abcd","XX");
printf("%s\n", dst);
return 0;
}
类型赋错了 布尔值赋给了指针