下面c语言程序在vc6.0里面编译是错了,求高手指正,最好略微解析下,我看不太懂,菜鸟自学c,求指导!

这个函数作用是实现已知字符串s中,所有属于s1中的字符都用s2中的对应字符代替,
看不懂的地方主要有if(*p)*s=*(p-s1+s2);clrscr();getch();
#include"stdio.h"
#define MAX 50
void repo(char*s,char*s1,char*s2)
{
char *p;
for(;*s;s++)
{
for(p=s1;*p&&*p!=*s;p++);
if(*p)*s=*(p-s1+s2);
}
}
main()
{
char s[MAX];/*="ABCABC";*/
char s1[MAX],s2[MAX];
clrscr();
puts("plese input the string for s:");
scanf("%s",s);
puts("plese input the string for s1:");
scanf("%s",s1);
puts("plese input the string for s2:");
scanf("%s",s2);
rep(s,s1,s2);
puts("the string of s atter dispalce is:");
prints("%s\n",s);
puts("\n press any key to quit...");
getch();
}

0.在C++中最好用标准输入输出库iostream.h,可执行程序如下:

#include"iostream.h"

#define MAX 50

void repo(char*s,char*s1,char*s2)

{

char *p;

for(;*s;s++)

{

for(p=s1;*p&&*p!=*s;p++);

if(*p)*s=*(p-s1+s2);

}

}

main()

{

char s[MAX];/*="ABCABC";*/

char s1[MAX],s2[MAX];

cout<<"plese input the string for s:"<<endl;

cin>>s;

cout<<"plese input the string for s1:"<<endl;

cin>>s1;;

cout<<"plese input the string for s2:"<<endl;

cin>>s2;

repo(s,s1,s2);

cout<<"the string of s atter dispalce is:"<<endl;

cout<<s<<endl;

}

1.编译错误是因为函数名在main()中调用不对

rep(s,s1,s2); 应该改成repo, 和void repo(char*s,char*s1,char*s2)保持一致

2.getch() 等待键盘字符输入,当输入任意字符时向下执行,这里功能是按任意键弹出dos环境

3.clcscr()清除dos环境下的显示

4.最后讲你最想知道的:

看每行代码的注释 我把程序改写成适合初学者的形式了 注字符串记为S,S1,S2,指针s,s1,s2

void repo(char*s,char*s1,char*s2)

{

char *p;                              //指针p作为局部变量

for(;*s;s++)                        //形参s是指针,指向scanf("%s",s);输入的字符串S的首地址,在s不指向空时一直循环,意思是遍历s的全部内容

{

for(p=s1;*p&&*p!=*s;p++)  //用p指针遍历字符串S1,意思是从S1第一个字符地址开始通过指针p顺序逐一指向每个字符,

                               ;                //空语句,什么也不做 -----如果S1字符串整串都不中不含有s指针当前对应的字符,无操作 

if(*p)                        //如果S1中含有当前s指向的S字符串中的内容

                   *s=*(p-s1+s2);     //属于S1中的字符用S2中的对应字符代替,p-s1求出S中属于S1字符串内容的位置,p-s1+s2求出S2中需替换的对应位置

}

}

比如S== ILOVEU

S1=EU

S2=OR

外层循环第一次

s->I

p->L

内层循环第一次

p->L 不等于 s->l

内层循环第二次

s1->E 不等于 s->l

外层第一次循环无替换

。。。以此类推

外层循环第五次

s->E

p->E

p->E 等于 s->E

for(p=s1;*p&&*p!=*s;p++) 不满足*p!=*s 内层循环不执行

替换s->E为

p-s1+s2->O

S 变成ILOVOU

外层循环第六次

s->U

p->E

内层循环第一次

p->E 不等于 s->U

内层循环第二次不执行因为:

p->U 等于s->U 不满足*p!=*s

执行

if(*p)                      

                   *s=*(p-s1+s2);

替换s->U为:

p-s1+s2->R

最后结果为

ILOVOU

希望这样写够详细,能帮你理解

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-28
编译错的原因是你上面定义的处理函数叫repo 在main里调用的时候写成了rep 少了个o
clrscr()是清除当前屏幕
getch()是等待你按键,其实这个完全木有必要
至于if(*p)*s=*(p-s1+s2); 好吧,我混乱了,我也没看明白这是想干嘛追问

还是有错误啊
e:\c语言\cpp69.cpp(16) : error C2065: 'clrscr' : undeclared identifier
e:\c语言\cpp69.cpp(25) : error C2065: 'prints' : undeclared identifier
e:\c语言\cpp69.cpp(27) : error C2065: 'getch' : undeclared identifier
e:\c语言\cpp69.cpp(28) : warning C4508: 'main' : function should return a value; 'void' return type assumed
Cpp69.obj - 3 error(s), 1 warning(s)

追答

getch和clrscr需要包含conio.h
至于prints我想你还是改成printf算了原本以为这个也是conio里的函数不过刚查了一下,似乎不是

本回答被提问者和网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网