求助!帮忙解释下两道c语言程序

来源:百度知道 编辑:UC知道 时间:2024/06/30 04:21:03
帮忙解释下这两道c语言程序,最好每句都解释,详细点,小弟实在是看不懂!
一、要求:假设字符串为:I like program c and c++,指定要删除n,则删除后的字符串为I like program c ad c++,如果在字符串中不存在输入的要删除的字符,则字符按原样输出,字母大小应按不同的字符处理。
在main函数中输入一个字符串(可以有空格)和一个要删除的字符,调用函数fun,最后输出结果。
#include<stdio.h>
long fun(char *str,char c)
{char *p;
for (p=str;*p!='\0';p++)
if(*p!=c)
*str++=*p;
*str='\0';
}void main()
{char str{80},char_c;
gets(str);
scanf("%c",char_c);
fun(str,char_c);
puts(str);
}
二、对8个数按由大到小进行排序用指针
#include <stdio.h>
#include <string.h>
void main()
{
int data[8],i,*p1,*p2,temp;
printf("Input 8 number:");
p1=date;
for(i=0;i<8;i++)
{scanf("%d",p1);
p1++;
}
for(p1=date;p1<date+8-1;p1++)
for(p2=p1+1;p2<date+8;p2++)
if(*p1<*p2)
{temp=*p1;*p1=*p2;*p2=temp;}
for(i=0,p1=date;i<8;i++,p1++)

一步一步,一句一句的给你解释.

long fun(char *str,char c) //参数第一个是主函数传入的字符串首地址,第二个参数是要删除的字符.
{char *p;
for (p=str;*p!='\0';p++) //把p指针初始化为字符串首地址,循环条件是,p指针地址上的值不为\0,意思就是说,循环条件是字符串没结束. 每循环一次,p++,就是说,p指针往后移动一个字符,指向下一个字符.
if(*p!=c) //如果p指针指向的位置的值不是要删除的那个字符,那么,p指针上的字符,赋值给指向字符串的指针str,并且,str往右移动一个字节.循环一圈,p指针也向右移动一个字节.
*str++=*p;
*str='\0'; //当循环结束后,str是被修改后的字符串的指针,所以str的位置一定是字符串末尾那个字母后面一格,所以这里添加\0,让他结束.

好了,重点讲下这里.
假设 字符串是 abcdefg 你要删除的是h,那么
fun函数for开头 p是指向a的,str也是指向a的.第一次判定,a!=h 所以 str移动,p也移动,p指针指向了b,str也指向了b,继续循环到g的时候,依然符合if条件,g!=h 所以,str 和 p都移动一格,都指向了abcdefg字符串后面的那个\0,然后,循环条件已经不满足,跳出循环,str指向的位置赋值\0.
这是找不到要删的情况.

下面是找的到要删的情况.字符串是abcdefg,要删的是c.
那么,前2次循环,str p都会移动,到了c的时候
if(*p!=c) 这个条件已经不满足了,因为p指向的字符是c了,要删的也是c

所以 *str++=*p 这句不执行.而p++之行了.这样的结果是,str现在指向的依然是c的位置,但是p已经指向了d了.
然后进入下一次循环时,满足 if条件 *str++=*