我有一段 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 个字符及其在原始数组中的空间? (产生与上述代码相同的输出)
最佳答案
这段代码使用了两个位置索引,i
和j
。最初,两个索引都初始化为零。索引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/