【C语言】使用函数实现字符串部分复制

C语言经典练习 专栏收录该内容
27 篇文章 1 订阅

本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。

函数接口定义:

void strmcpy( char *t, int m, char *s );

函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 20

void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char t[MAXN], s[MAXN];
    int m;

    scanf("%d\n", &m);
    ReadString(t);
    strmcpy( t, m, s );
    printf("%s\n", s);

    return 0;
}

/* 你的代码将被嵌在这里 */
输入样例:
7
happy new year
输出样例:
new year

由于这道题题目中没有把string.h头文件include进来,
所以自己写一个计算长度的函数

int strlen(char *t)
{
    int i=0;
	while(*t)
	{
		t++;
		i++;
	}
	return i;
}

首先很直观地就可以把代码写出来:

void strmcpy( char *t, int m, char *s )
{
    int n=strlen(t);
    for(int i=0;i<=n-m;i++)
    {
    	s[i]=t[m+i-1];
    	printf("s[%d]=%c\n",i,s[i]);
	}
}

但是这种做法导致最后出来会有多余的空格,因为数组s没有添加结束标记。
没有添加结束标记时,一次性输出数组将导致格式错误。因此还需添加结束标记:

void strmcpy( char *t, int m, char *s )
{
    int n=strlen(t);
    for(int i=0;i<=n-m+1;i++)   /*把n-m改成了n-m+1,为添加标记创造条件*/
    {
    	if(t[m+i-1]=='\0') s[i]='\0';   /*当扫描时发现目标数组中出现结束标记时,为本字符串添加结束标记*/
		s[i]=t[m+i-1];         /*扫描*/
	}
}

来一遍完整代码:

#include <stdio.h>
#define MAXN 20

void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* ÓɲÃÅÐʵÏÖ£¬ÂÔÈ¥²»±í */

int main()
{
    char t[MAXN], s[MAXN];
    int m;

    scanf("%d\n", &m);
    ReadString(t);
    strmcpy( t, m, s );
    printf("%s\n", s);

    return 0;
}

/* ÄãµÄ´úÂ뽫±»Ç¶ÔÚÕâÀï */
int strlen(char *t)
{
    int i=0;
	while(*t)
	{
		t++;
		i++;
	}
	return i;
}

void ReadString( char s[] )
{
	gets(s);
}

void strmcpy( char *t, int m, char *s )
{
    int n=strlen(t);
    for(int i=0;i<=n-m+1;i++)
    {
    	if(t[m+i-1]=='\0') s[i]='\0';
		s[i]=t[m+i-1];
	}
}

在这里插入图片描述

  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 点我我会动 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值