编写取子字符串函数void fun(char s1[],char s2[],int m,int n),其作用是将字符数组s2中从第m个字符开始

编写取子字符串函数voidfun(chars1[],chars2[],intm,intn),其作用是将字符数组s2中从第m个字符开始的共n个字符拷贝到数组s1中;若s2中... 编写取子字符串函数void fun(char s1[],char s2[],int m,int n),其作用是将字符数组s2中从第m个字符开始的共n个字符拷贝到数组s1中;若s2中剩余字符不足n个,则取到尾部。程序运行时,当输入"abcd123"、4,3时应输出"d12";当我们输入"abcd123"、4,6时应输出"d123"。
这么写 错在哪?
#include<stdio.h>
void fun(char s1[],char s2[],int m,int n)
{
int len=0;
while(s2[len]) len++;
for (;m<=len && (s1-&s1[0])<n;)
*(s1++)=*(s2-1+m++);
*s1=0;
}
void main()
{
static char a[100],b[100];
int s,len;
void fun(char s1[],char s2[],int m,int n);
puts("ENTER A STRING:");
gets(a);
puts("ENTER STARTING POSITION AND LENGTH:");
scanf("%d,%d",&s,&len);
fun(b,a,s,len);
printf("THE SRBSTING IS:%s\n",b);
}
我感觉是for那儿错了 但找不出来
而且我发现我在C free和VC上运行结果不一样
cfree是自m个到结束都输出
VC是什么都没有
展开
 我来答
雪龙玉龙
2013-06-01
知道答主
回答量:12
采纳率:0%
帮助的人:17.7万
展开全部

#include<stdio.h>

#include<string.h>

char *f(char *s,int m,int n);

int main(void)

{

int m,n;

char s1[20];

printf("Please input m and n:");

scanf("%d%d",&m,&n);

printf("Please input a string:");

scanf("%s",s1);

printf("%s\n",f(s1,m,n));

return 0;

}

char *f(char *s,int m,int n)

{

int i,j=0;

char t[20];

for(i=m-1;i<=m+n-2;i++,j++)

        t[j]=s[i];

t[j]='\0';

strcpy(s,t);

return (s);

}

更多追问追答
追问
我是问我的错哪里了,不是问其他答案
还有 你的这个会有问题的 当m大于字符长度的时候会有问题
追答

void类型的函数是不返回函数,不能像你那样用。还有逻辑上的错误。我给你改了一下,我认为没有我第一种那样简单。只要加个do while 循环就能解决m或n大于字符串长度的问题了。

#include<stdio.h>

void fun(char s1[],char s2[],int m,int n)

{

int i,j=0;

for(i=m-1;i<m+n-1;i++,j++)

        s2[j]=s1[i];

s2[j]='\0';

printf("THE SRBSTING IS:");

for(j=0;s2[j]!='\0';j++)

printf("%c",s2[j]);

printf("\n");

}

void main()

{

char a[100],b[100];

int s,len;

printf("ENTER A STRING:");

scanf("%s",a);

printf("ENTER STARTING POSITION AND LENGTH:");

scanf("%d%d",&s,&len);

fun(a,b,s,len);

}

Joshion2008
推荐于2017-10-02 · TA获得超过152个赞
知道小有建树答主
回答量:175
采纳率:0%
帮助的人:133万
展开全部
#include<stdio.h>
void fun(char s1[],char s2[],int m,int n)
{
int len=0;
int count = 0;
while(s2[len]) len++;
for (;m<=len && (count < n);++count;) //加个变量统计计数就可以了,没必要那么繁琐
*(s1++)=*(s2-1+m++);




}
void main()
{
static char a[100],b[100];
int s,len;
void fun(char s1[],char s2[],int m,int n);
puts("ENTER A STRING:");
gets(a);
puts("ENTER STARTING POSITION AND LENGTH:");
scanf("%d,%d",&s,&len);//输入注意3,4如果没“,”那么n赋值失败
fun(b,a,s,len);
printf("THE SRBSTING IS:%s\n",b);
}
更多追问追答
追问

咕~~(╯﹏╰)b 你的运行结果和我原来的一样有问题

而且你循环里多了个 ;

追答
#include<stdio.h>
void fun(char s1[],char s2[],int m,int n)
{
    int len=0;
    int count = 0;
    while(s2[len]) len++;
    for (;m<=len && (count < n);++count) //加个变量统计计数就可以了,没必要那么繁琐
        *(s1++)=*(s2-1+m++);
}
void main()
{
    static char a[100],b[100];
    int s,len;
    void fun(char s1[],char s2[],int m,int n);
    puts("ENTER A STRING:");
    gets(a);
    puts("ENTER STARTING POSITION AND LENGTH:");
    scanf("%d,%d",&s,&len);//输入注意3,4如果没“,”那么n赋值失败
    fun(b,a,s,len);
    printf("THE SRBSTING IS:%s\n",b);
}

我都说了,你在scanf的时候,两个参数,中间有个“,”,所以,你输入的时候也要3,4,不然你第二个参数赋值的是,,这样就导致第二个值赋值失败。


你也可以这样scanf("%d%d",&s,&len);

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
White_MouseYBZ
2013-06-02 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6803万
展开全部
for (;m<=len && (s1-&s1[0])<n;)中s1-&s1[0]永远为0,所以(s1-&s1[0])<n总是为“真”。改如下就行了:
for (s2+=(m-1);n>0 && *s2;n--)
*s1++ = *s2++;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友d580670
2013-06-02 · TA获得超过1983个赞
知道大有可为答主
回答量:2054
采纳率:82%
帮助的人:718万
展开全部
void fun..{
int len=strlen(s2);
if (m<len){strncpy(s1,s2 m,n);}
}
追问
→_→
追答
if (m<len){strncpy(s1,s2+m,n);} sorry手机打不上+
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sdjj45555
2013-06-01
知道答主
回答量:4
采纳率:0%
帮助的人:5919
展开全部
121的范德法特飞
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式