You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(频繁调用会降低效率):

  1. 先获取初始长度并存入变量:
    int len1 = strlen(str1);
    
  2. 删除字符后,将长度减1,并把终止符移到新的末尾:
    len1--;
    str1[len1] = '\0';
    
  3. 循环中使用缓存的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:27:24