掉坑:
- 场景描述不对:
导致运行错误:negative-para-size (size = -1)
原因是else处理里有 char *sres = str + si - 1; 当 si = 0, 则字符串 str 偏移负位;改为
- str = “” 一无法返回改变后的str值;二不能直接这样赋值;str = NULL不行;改为 *str = ‘\0’;
- 场景考虑不全:
// 1. 思路一:memcpy + s[index] != 0 处理出去掉所有#的字符串,结果字符串strcmp比较;
// 2. 思路二:双指针:Left right向背走,遇到不同的看后边有无#,有则left right跳过该不同字符和#,无则找到下一个#看是否可以退掉该不同字符;
int CalBackSpace(char *str)
{
int cnt = 0;
for (int i = 0; i < strlen(str); i++) {
if (str[i] == '#') {
cnt++;
}
}
return cnt;
}
void RemoveBackSpace(char *str)
{
int si = 0;
while (str[si] != '\0'){
if (str[si] == '#') { // 两种情况:1.删到最后剩俩字符,一字母跟一#,如 "a#", 则 *str = '\0'; return √;// 2."b#nzp#o#g":si = 1 但 后边还有(字符串未结束)
int len = strlen(str);
char scpy[len - si];
scpy[len - si - 1] = '\0';
memcpy(scpy, str + si + 1, len - si);
int offset = si == 0 ? 0 : si - 1;
memcpy(str + offset, scpy, len - si);
//str[len - 2] = '\0';
si = si == 0 ? si - 1: si - 2;
}
si++;
}
//printf("%s\n", str);
}
bool backspaceCompare(char * s, char * t){
int scnt = CalBackSpace(s);
int tcnt = CalBackSpace(t);
while (scnt > 0) {
RemoveBackSpace(s);
scnt = CalBackSpace(s);
}
while (tcnt > 0) {
RemoveBackSpace(t);
tcnt = CalBackSpace(t);
}
bool ans = strcmp(s, t) == 0 ? true : false;
return ans;
}