吃不胖啊吃不胖 2021-08-02 22:03 采纳率: 50%
浏览 17

从字符串中删除一个键入的字符,这段代码如何理解?


#include<stdio.h>
void delete_string(char str[], char ch)
{
    int i, j;
    for (i = j = 0; str[i] != '\0'; i++)
        if (str[i] != ch) str[j++] = str[i];
    str[j] = '\0';
}
  • 写回答

2条回答 默认 最新

  • 八云黧 2021-08-02 22:18
    关注

    这是典型的双下标遍历数组的算法
    考虑去掉if判断的情况:

    #include<stdio.h>
    void delete_string(char str[], char ch)
    {
        int i, j;
        for (i = j = 0; str[i] != '\0'; i++)
             str[j++] = str[i];
        str[j] = '\0';
    }
    

    你会发现关键代码str[j++] = str[i];并没有修改字符串数组,因为j和i永远是同步的。
    再看带上if判断的关键代码if (str[i] != ch) str[j++] = str[i];,i每次循环就自增但j只有在字符不是要删除的字符时才自增
    考虑字符串"hello",即数组['h','e','l','l','o','\0]
    想要删除e,
    第1轮循环后j=1.i=1
    第2轮循环由于if判断为否,直接进行下轮循环,此时j=1,i=2
    第3轮循环关键代码就为str[1] = str[2],直接用下一个字符l把待删除字符e给替换了,这里开始i和j这两个下标就永远差1,导致直接把llo往数组的前面移动了一格

    评论

报告相同问题?

问题事件

  • 创建了问题 8月2日

悬赏问题

  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测