Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

今天跟着K&R继续学习C语言,其中有这么一段代码让我感觉很妙:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

void chars_process(char fire[], char c)
{
int g, f;
for (g = f = 0; fire[g] != '\0'; g++)
if (fire[g] != c)
fire[f++] = fire[g];
fire[f] = '\0';
}

这是一段删除字符串中指定字符的代码。如果您觉得这段代码没什么,那么这篇博客下面的内容就不需要看了。如果您对它感兴趣,请继续看我分析。

相信您也看得出来,这段代码是个函数,其有两个形参,分别是字符数组类型的fire和字符类型的c,因为我们要删除字符串中的指定字符嘛,所以这两个参数必不可少。

下面是主要思路: 让字符串从开始到结尾过一遍,如果当前字符不是指定的那个字符,那么就对它重新赋值;如果当前字符是指定的那个字符,那么就跳过它。

那么接下来我们来讲一下上面的代码,f++是先使用f的值,再自增1,所以当fire[g] != c时,执行的语句就相当于对fire[g]重新赋值。但是当fire[g] == c时,除了判断和g自增后没有执行的语句。当fire[g]再次不等于c时,fire[f++] = fire[g]就会执行。因为中间fire[g] == c的时候没有赋值,所以这次fire[f++] = fire[g]就相当于跳过了字符c: 此时的f != g,此时的f就是原来字符c的位置,此时的g就是c字符之后的位置。

此程序设计之精巧真是让人赞叹,虽然每一次for的赋值感觉有点浪费,但是在这个思路下似乎只能如此。如果您有更好的想法欢迎使用GitTalk留言。

那么本篇完。

评论



愿火焰指引你