C 字符串删除 - 此代码如何工作?

标签 c arrays string char

我有一段 C 代码可以完全从字符数组中删除每个第二个字符,使原始数组的大小减半(如果大小为奇数,则减半+1)

..但我不知道它是如何工作的。

void del_str(char string[]) {
    int i,j;
    for(i=0, j=0; string[i]!=0; i++) {
        if(i%2==0) {
            string[j++]=string[i];
        }
    }
    string[j]=0;
}

//
example input: 'abcdefgh'
output from that: 'aceg'
what I thought the output would be: 'aacceegg'

我不明白的是

string[j++]=string[i];

我可以编写省略第二个字符的代码,因此输出将是:

'a c e g '

但我无法解决这个问题。

或者,您将如何编写一个程序来完全删除每个第 n 个字符及其在原始数组中的空间? (产生与上述代码相同的输出)

最佳答案

这段代码使用了两个位置索引,ij。最初,两个索引都初始化为零。索引i用于读取; index j 用于写入。

Index i 在循环的每一步递增,因为增量 i++ 在循环的头部。另一方面,索引 j 每隔一次迭代递增,因为 j++ 仅在 i 为偶数时发生。索引 i 总是比索引 j 更接近或更接近字符串的末尾,因为它移动得“更快”。

空终止符被放置在循环结束时 j 的最终位置,以指示字符串结束的新位置。

或许举个小例子更容易理解。考虑 “abcdef” 的初始字符串。它在算法开始时在内存中的表示如下:

'a' 'b' 'c' 'd' 'e' 'f' '\0'

这是在循环的每一步之后它会如何变化:

'a' 'b' 'c' 'd' 'e' 'f' '\0'
'a' 'c' 'c' 'd' 'e' 'f' '\0'
'a' 'c' 'e' 'd' 'e' 'f' '\0'
'a' 'c' 'e' '\0' 'e' 'f' '\0'

由于 C 字符串忽略 '\0' 之后的所有内容,因此 'e' 'f' '\0' 的“尾部”不被视为字符串的一部分.

关于C 字符串删除 - 此代码如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32570875/

相关文章:

Python numpy 二维数组最小值

c - 如何扫描用户的字数并打印字符串?

python - 创建流以从 Python 中的字符串迭代

javascript - 解析/操作格式奇怪的 json 数组

c++ - C/C++ - 将 24 位有符号整数转换为 float

c - 在 C 中加起来 1/2 + 2/3 +...+ 18/19 + 19/20

arrays - 从像素阵列问题中获取 NSImage (Swift)

php - 如何与PHP一起显示带有限制的mysql数组

c - 格式说明符在内部如何工作?

c语言,标准输出中的额外消息?