关于第七章外部函数的习题案例
这个题很有意思,有兴趣的朋友可以自己看一看,最好可以自己用代码实现一下,很精妙的一个小程序。
提示:以下是本篇文章正文内容,下面案例可供参考
一、案例题目
有一个字符串,内有若干个字符,现输入一个字符,要求程序将字符串中该字符删去。用外部函数实现。
其实问题很简单,就是一个简单的删除,这个程序不在于功能多复杂,而是设计的很精妙哈哈。话不多说咱们来看实现方法
二、实现方法
1.main.c
// 例子7.20(删除指定字符)(外部函数)
int main() {
extern void enter_string(char str[]); //声明外部输入函数
extern void delete_string(char str[],char ch); //声明外部删除函数
extern void print_string(char str[]); //声明外部输出函数
char c,str[80];
enter_string(str);
scanf("%c",&c);
delete_string(str,c);
print_string(str);
return 0;
}
2.outer.c
为了简洁,我把三个函数代码都放在这一个源程序文件中。我们主要是看中间的delete_string函数,设计很巧妙。
//外部输入函数
void enter_string(char str[]) {
gets(str); //输入一个字符串
}
//外部删除函数
void delete_string(char str[], char ch) {
int j;
for (int i = j = 0; str[i] != '\0'; ++i) {
if (str[i] != ch) str[j++] = str[i];
}
str[j] = '\0';
}
//外部输出函数
void print_string(char str[])
{
printf("%s\n",str); //输出字符串
}
分析:函数定义了两个变量,i和j,作用是什么未知,我们来进行分析。首先来看for循环,初始化,循环条件,趋于结束的操作,都是齐全的。
我们看循环条件,很简单,就是一直循环到字符串结束为止。我们模拟输入”This is C Program“,和’ '(空格字符)。
- 第一次循环:首先i和j都是0,str[0]!=’\0’ (str[0]=‘T’)符合循环的条件,进入循环中,判断当前字符是不是 ’ 空格
’ 字符。很显然不是,执行if结构体内的操作,把str[i]赋值给str[j],再让j自加1,进行下一次循环。 - 第二次循环:i也自增1,这时i和j还是一样。i=1,j=1。第二次循环类似于第一次,我们不做过多描述,直接看不同的。到这里都看不明白的盆友,一步一步用纸写下来看一哈哦。
…
- 第五次循环:i和j都为4,这时不一样的来了,if条件不正确,不执行方法体。则j和i的值就出现了一个差值。
- 第六次循环:i的值为5,j的值为4,if条件满足,这时就会把str[i]的值覆盖给str[j]上,也就是下一位把上一位的值替换。这时i和j再正常进行自增。
…
- 第八次循环:i的值为7,j的值为6,同理进行操作,跳过循环。
…
- 第十六次循环:这时字符串已经被修改为”ThisisCProgram“,但还是有个问题,字符串结束的标志’\0’呢。我们在循环结束的时候把它加上。
有些盆友可能想问,为什么在str[j]的地方加上\0呢,我们仔细想一想,我们是要在字符串结尾的地方加上这个结束标识符,那么我们就需要知道这个字符串的有效长度。如何知道呢有效长度?j 的值恰好就是有效长度,每次循环字符与我们输入的字符不同的时候,j的值都会加一,这样就可以把有效长度的值统计出来,而且他是从1开始的,刚好可以放在字符串的最后面!
这样一个看似毫无关联的变量,其实串接起来很多我们需要做的任务,很巧妙哈。
总结
其实程序很简单,不过我们也要从简单的问题找到一些有价值的方法和知识。以上就是对外部函数删除指定字符串的理解,欢迎大家讨论。