C语言strlen表达式不可赋值错误解决及字符串缩短方法咨询
问题:删除字符串重复字符时的编译错误及解决方案
编译错误信息
solution.c:16:26: error: expression is not assignable (int)strlen(str1)--; ~~~~~~~~~~~~^
问题背景
编写程序判断给定乱序字符串str1能否重排为目标单词str2时,尝试删除str1中重复字符时出现上述编译错误,需要解决如何正确删除字符并缩短字符串,同时修正解题逻辑。
完整代码
#include <stdbool.h> #include <string.h> #include <stdio.h> bool scramble(char *str1, char *str2) { /* solution here */ bool indicator = false; for(int i=0; i<(int)strlen(str1); i++){ char ch = str1[i]; for(int j=i+1; j<(int)strlen(str1); ){ if(str1[i] == str1[j]){ for(int k=j; k<(int)strlen(str1); k++){ str1[k] = str1[k+1]; } (int)strlen(str1)--; } else { j++; } } } for (int i = 0; i < (int)strlen(str2); i++) { for (int j = 0; j < (int)strlen(str1); j++) { if (str1[j] == str2[i]) { indicator = true; } } if (indicator == true) { continue; } else { return false; } } //printf("%d ", indicator); if (indicator == true) { return true; } else { return false; } }
错误原因分析
(int)strlen(str1)-- 是非法操作:
strlen(str1)返回的是临时数值(右值),无法对其执行自减这类需要修改操作数的指令。- 字符串的实际长度由末尾的终止符
\0决定,修改strlen的返回值不会改变字符串本身的结构。
正确的字符串缩短方法
当删除字符后,需要手动调整字符串的终止符位置,同时用变量缓存长度避免重复调用strlen(频繁调用会降低效率):
- 先获取初始长度并存入变量:
int len1 = strlen(str1); - 删除字符后,将长度减1,并把终止符移到新的末尾:
len1--; str1[len1] = '\0'; - 循环中使用缓存的
len1代替每次调用strlen(str1)
重要逻辑修正:你的解题思路有误
题目要求判断str1能否重排为str2,核心是**str1中每个字符的出现次数不少于str2中的对应次数**,而不是简单去重后包含所有字符。比如:
- 若
str2是"aab",str1是"ab",去重后str1是"ab",你的代码会错误返回true,但实际无法组成目标字符串。
更高效的正确解法:统计字符频率
#include <stdbool.h> #include <string.h> bool scramble(char *str1, char *str2) { int count[256] = {0}; // 统计ASCII字符出现次数 // 统计str1的字符频率 for (int i = 0; str1[i] != '\0'; i++) { count[(unsigned char)str1[i]]++; } // 遍历str2,检查频率是否足够 for (int i = 0; str2[i] != '\0'; i++) { unsigned char c = (unsigned char)str2[i]; if (count[c] == 0) { return false; } count[c]--; } return true; }
内容的提问来源于stack exchange,提问作者thecodeguy
相关产品推荐
相关产品推荐

