C语言编程请教:编写一个程序,
要求是:输入一个字符串后再输入2个字符,输出此字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。用返回字符指针的函数实现。例:(括号内为说明)输...
要求是:输入一个字符串后再输入2个字符,输出此字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。用返回字符指针的函数实现。
例:(括号内为说明)
输入
program
r
g
输出
rog
已经知道的语句有:#include <stdio.h>
char newstr[80];
void main()
{
char str[80],c_begin,c_end;
char *fun(char *p,char c_begin,char c_end);
scanf("%s",str);
getchar();
c_begin=getchar();
getchar();
c_end=getchar();
puts(fun(str,c_begin,c_end));
}
我自己写的函数是:char *fun(char *p,char c_begin,char c_end)
{
int i,n1,n2;
char str[80],str2;
for(i=0;*p!='\0';i++){
if(*p==c_begin){
n1=0;str2=p[n1];strcat(str,str2);
n1++;
}
else if(*p==c_end){
str2=p[n1];strcat(str,str2);break;
}
}
printf("%s",str);
p=str;
printf("%s",p);
}
请各位好心人帮忙看一下哪里除了问题。谢谢!指针我是真的有点搞不明白! 展开
例:(括号内为说明)
输入
program
r
g
输出
rog
已经知道的语句有:#include <stdio.h>
char newstr[80];
void main()
{
char str[80],c_begin,c_end;
char *fun(char *p,char c_begin,char c_end);
scanf("%s",str);
getchar();
c_begin=getchar();
getchar();
c_end=getchar();
puts(fun(str,c_begin,c_end));
}
我自己写的函数是:char *fun(char *p,char c_begin,char c_end)
{
int i,n1,n2;
char str[80],str2;
for(i=0;*p!='\0';i++){
if(*p==c_begin){
n1=0;str2=p[n1];strcat(str,str2);
n1++;
}
else if(*p==c_end){
str2=p[n1];strcat(str,str2);break;
}
}
printf("%s",str);
p=str;
printf("%s",p);
}
请各位好心人帮忙看一下哪里除了问题。谢谢!指针我是真的有点搞不明白! 展开
5个回答
展开全部
char *fun(char *p,char c_begin,char c_end)
{
int i,n1=-1,n2;
char str[80],str2;
for(i=0;p[i]!='\0';i++){//修改*p为p[i]让判断可以正确的扫描字符串
if(p[i]==c_begin){//修改*p为p[i]让判断可以正确的扫描字符串
n1=i; //记录起始位置
}
else if(p[i]==c_end){ //修改*p为p[i]让判断可以正确的扫描字符串
str2=p[i];strcat(str,str2);break;
}
else if(n1!=-1){//n1不等于-1的话,说明已经找到了起始点,将这个条件放在第三位是因为如果p[i]==c_end的话可以正常的终止循环
str2=p[i];strcat(str,str2);//将i位置的字符加入str中
}
}
printf("%s",str);
p=str;
printf("%s",p);
return str;
}
或者
char *fun(char *p,char c_begin,char c_end)
{
int i,n1=-1,n2==-1;
char str[80],str2;
for(i=0;p[i]!='\0';i++){
if(p[i]==c_begin){ //检查字符串p的第i个字符是否等于c_begin
if(n1==-1)n1=i; //这个判断保证n1是c_begin第一次出现的位置
}
else if(p[i]==c_end){ //检查字符串p的第i个字符是否等于c_end
n2=i;break;
}
}
for(i=0;i<n1-n2;i++){//通过循环将p中处于n1与n2之间的字符写入str中
str[i]=p[n1+i];
}
return str;
}
好久没写C程序了,手头上也没有编译器,只是提供一个思路..指针这个东西就是一个指向内存地址的变量,这个例子里面的p记录的是一个字符传的其实位置的内存地址,*p就是代表p指针记录的内存地址的内容,字符串的字符是连续存放的,所以用p++这个样的方法可以让p指向字符串的下一个字符,但是这里没有这么做是为了不改变p的指向,实际上p[i]和*(p+i)是一样的都是代表p指向的字符串的第i个字符,而数组的名字其实就是指向这个数组的第一个元素的指针,故最后rutrun str。你之前的程序里面最大的问题是在循环里面没有移动p指针,换句话说,循环的条件*p!='\0'无论循环多少次都是一样的因为一直是用字符串的第一个字符去和'\0'去比较,会变成死循环。另外n1=0;str2=p[n1];strcat(str,str2); 这个部分会每次都让n1=0,故每次就是追加p的第一个字符,而且也只p的第一个字符等于c_begin时才执行这部分代码,所以即使循环是正常的,那么截到的字符串也只是由几个c_begin和一个c_end组成的。第一种是在你的方法上尽量保持与你相同的思路来修改的,二个种是我最开始想到的,提供你参考
{
int i,n1=-1,n2;
char str[80],str2;
for(i=0;p[i]!='\0';i++){//修改*p为p[i]让判断可以正确的扫描字符串
if(p[i]==c_begin){//修改*p为p[i]让判断可以正确的扫描字符串
n1=i; //记录起始位置
}
else if(p[i]==c_end){ //修改*p为p[i]让判断可以正确的扫描字符串
str2=p[i];strcat(str,str2);break;
}
else if(n1!=-1){//n1不等于-1的话,说明已经找到了起始点,将这个条件放在第三位是因为如果p[i]==c_end的话可以正常的终止循环
str2=p[i];strcat(str,str2);//将i位置的字符加入str中
}
}
printf("%s",str);
p=str;
printf("%s",p);
return str;
}
或者
char *fun(char *p,char c_begin,char c_end)
{
int i,n1=-1,n2==-1;
char str[80],str2;
for(i=0;p[i]!='\0';i++){
if(p[i]==c_begin){ //检查字符串p的第i个字符是否等于c_begin
if(n1==-1)n1=i; //这个判断保证n1是c_begin第一次出现的位置
}
else if(p[i]==c_end){ //检查字符串p的第i个字符是否等于c_end
n2=i;break;
}
}
for(i=0;i<n1-n2;i++){//通过循环将p中处于n1与n2之间的字符写入str中
str[i]=p[n1+i];
}
return str;
}
好久没写C程序了,手头上也没有编译器,只是提供一个思路..指针这个东西就是一个指向内存地址的变量,这个例子里面的p记录的是一个字符传的其实位置的内存地址,*p就是代表p指针记录的内存地址的内容,字符串的字符是连续存放的,所以用p++这个样的方法可以让p指向字符串的下一个字符,但是这里没有这么做是为了不改变p的指向,实际上p[i]和*(p+i)是一样的都是代表p指向的字符串的第i个字符,而数组的名字其实就是指向这个数组的第一个元素的指针,故最后rutrun str。你之前的程序里面最大的问题是在循环里面没有移动p指针,换句话说,循环的条件*p!='\0'无论循环多少次都是一样的因为一直是用字符串的第一个字符去和'\0'去比较,会变成死循环。另外n1=0;str2=p[n1];strcat(str,str2); 这个部分会每次都让n1=0,故每次就是追加p的第一个字符,而且也只p的第一个字符等于c_begin时才执行这部分代码,所以即使循环是正常的,那么截到的字符串也只是由几个c_begin和一个c_end组成的。第一种是在你的方法上尽量保持与你相同的思路来修改的,二个种是我最开始想到的,提供你参考
展开全部
char
*fun(char
*p,char
c_begin,char
c_end)
{
int
i,n1=-1,n2;
char
str[80],str2;
for(i=0;p[i]!='\0';i++){//修改*p为p[i]让判断可以正确的扫描字符串
if(p[i]==c_begin){//修改*p为p[i]让判断可以正确的扫描字符串
n1=i;
//记录起始位置
}
else
if(p[i]==c_end){
//修改*p为p[i]让判断可以正确的扫描字符串
str2=p[i];strcat(str,str2);break;
}
else
if(n1!=-1){//n1不等于-1的话,说明已经找到了起始点,将这个条件放在第三位是因为如果p[i]==c_end的话可以正常的终止循环
str2=p[i];strcat(str,str2);//将i位置的字符加入str中
}
}
printf("%s",str);
p=str;
printf("%s",p);
return
str;
}
或者
char
*fun(char
*p,char
c_begin,char
c_end)
{
int
i,n1=-1,n2==-1;
char
str[80],str2;
for(i=0;p[i]!='\0';i++){
if(p[i]==c_begin){
//检查字符串p的第i个字符是否等于c_begin
if(n1==-1)n1=i;
//这个判断保证n1是c_begin第一次出现的位置
}
else
if(p[i]==c_end){
//检查字符串p的第i个字符是否等于c_end
n2=i;break;
}
}
for(i=0;i
评论
0
0
加载更多
*fun(char
*p,char
c_begin,char
c_end)
{
int
i,n1=-1,n2;
char
str[80],str2;
for(i=0;p[i]!='\0';i++){//修改*p为p[i]让判断可以正确的扫描字符串
if(p[i]==c_begin){//修改*p为p[i]让判断可以正确的扫描字符串
n1=i;
//记录起始位置
}
else
if(p[i]==c_end){
//修改*p为p[i]让判断可以正确的扫描字符串
str2=p[i];strcat(str,str2);break;
}
else
if(n1!=-1){//n1不等于-1的话,说明已经找到了起始点,将这个条件放在第三位是因为如果p[i]==c_end的话可以正常的终止循环
str2=p[i];strcat(str,str2);//将i位置的字符加入str中
}
}
printf("%s",str);
p=str;
printf("%s",p);
return
str;
}
或者
char
*fun(char
*p,char
c_begin,char
c_end)
{
int
i,n1=-1,n2==-1;
char
str[80],str2;
for(i=0;p[i]!='\0';i++){
if(p[i]==c_begin){
//检查字符串p的第i个字符是否等于c_begin
if(n1==-1)n1=i;
//这个判断保证n1是c_begin第一次出现的位置
}
else
if(p[i]==c_end){
//检查字符串p的第i个字符是否等于c_end
n2=i;break;
}
}
for(i=0;i
评论
0
0
加载更多
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有人已经给你把char *fun(char *p,char c_begin,char c_end) 函数修改过了,我说说main()函数,main函数里面char *fun(char *p,char c_begin,char c_end) 调用的位置不对,应该在输入字符函数的后面,而且不能重复定义 c_begin, c_end,另外你的getchar()函数的使用不当,因为每调用一次getchar()函数,系统就从键盘上接收了一个字符串,所以把多余的两个getchar()必须去掉。否则你的c_begin,c_end就接受的是\n的ASCII值10
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <stdio.h>
char str[80];
void main()
{
char str[80],c_begin,c_end;
char *fun(char *p,char c_begin,char c_end);
scanf("%s",str);
getchar();
c_begin=getchar();
getchar();
c_end=getchar();
puts(fun(str,c_begin,c_end));
}
char *fun(char *p,char c_begin,char c_end)
{
int i,j,k=0;
for(i=0;p[i]!='\0';i++)
{
if(p[i]==c_begin)
{
for(j=i;p[j]!='\0';j++)
{
if(p[j]==c_end)
{
str[k++]=p[j];
str[k]='\0';
goto l1;
}
else str[k++]=p[j];
}
goto l2;
}
}
l2: return "no";
l1: return str;
}
这个程序可以正确运行,我调试好的
char str[80];
void main()
{
char str[80],c_begin,c_end;
char *fun(char *p,char c_begin,char c_end);
scanf("%s",str);
getchar();
c_begin=getchar();
getchar();
c_end=getchar();
puts(fun(str,c_begin,c_end));
}
char *fun(char *p,char c_begin,char c_end)
{
int i,j,k=0;
for(i=0;p[i]!='\0';i++)
{
if(p[i]==c_begin)
{
for(j=i;p[j]!='\0';j++)
{
if(p[j]==c_end)
{
str[k++]=p[j];
str[k]='\0';
goto l1;
}
else str[k++]=p[j];
}
goto l2;
}
}
l2: return "no";
l1: return str;
}
这个程序可以正确运行,我调试好的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2009-03-20
展开全部
#include<stdio.h>
char str[];
void fun(char c1,char c2);
void main()
{
char c1,c2;
printf("输入字符串");
gets(str);
printf("输入字符");
getchar(c1);
getchar(c2);
fun(c1,c2);
return;
}
fun(char c1,char c2)
{
int i,j,k;
for(i=0;;i++)
{
if(c1==(str+i))
j=i;
if((str+i)==0)
break;
}
for(i=j;;i++0)
{
if(c2==(str+i))
k=i;
if((str+i)==0)
break;
}
for(i=j;i<=k;i++)
printf("%c",(str+i));
return;
}
char str[];
void fun(char c1,char c2);
void main()
{
char c1,c2;
printf("输入字符串");
gets(str);
printf("输入字符");
getchar(c1);
getchar(c2);
fun(c1,c2);
return;
}
fun(char c1,char c2)
{
int i,j,k;
for(i=0;;i++)
{
if(c1==(str+i))
j=i;
if((str+i)==0)
break;
}
for(i=j;;i++0)
{
if(c2==(str+i))
k=i;
if((str+i)==0)
break;
}
for(i=j;i<=k;i++)
printf("%c",(str+i));
return;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询