下面c语言程序在vc6.0里面编译是错了,求高手指正,最好略微解析下,我看不太懂,菜鸟自学c,求指导!
看不懂的地方主要有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
希望这样写够详细,能帮你理解
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里的函数不过刚查了一下,似乎不是