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


#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';
}

这是典型的双下标遍历数组的算法
考虑去掉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往数组的前面移动了一格

原理就是遍历str数组,当str数组中的元素跟ch一样,就跳过,这样正好把剩下的保留下来,最后加个\0表示数组结束,起到删除指定字符的作用。