8.7 题目:
有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
思路:首先写一个简单的字符数量n为固定值的代码,感受一下大概算法
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
const char* q = "my name is jym";
char str[20];
char* p;
int i, m, n=14;
p = str;//指针p指向一个空字符数组,用于存放复制的字符
printf("请选择从第几个字符开始复制:m=");
scanf("%d", &m);
for (i = 0; i < n-m+1; i++)//第m个字符在数组的位置为[m-1],剩余字符数量为n-m+1(包括第m个字符本身)
*(p + i) = *(q + m - 1 + i);//将剩余的字符逐个赋给空字符数组
*(p + i) = '\0';//在结尾手动加上结束符
printf("从第%d个字符开始复制后,结果为:", m);
for (i = 0; i < n - m + 1;i++,p++)
printf("%c", *p);
return 0;
}
运行结果无误,再改进一下代码,当n为动态值时的情况,需要注意到就是如何统计
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
char str1[20], str2[20];
char *q=str1, *p=str2;//指针p指向一个空字符数组,用于存放复制的字符
int i, m, n=0;
printf("请输入一组少于20个的字符:");
for (;q < (str1 + 20) && *q != '\n';q++)//在输入的过程中同时检查总共有多少字符
{
scanf("%c",q);
if (*q == '\n')break;//如果检测到输入了"回车符",直接退出输入循环,输入结束
n++;
}
q = str1;//使指针q重新指向str1,因为在上个输入循环时q已经指向数组末尾了
printf("请选择从第几个字符开始复制:m=");
scanf("%d", &m);
for (i = 0; i < n-m+1; i++)//第m个字符在数组的位置为[m-1],剩余字符数量为n-m+1(包括第m个字符本身)
*(p + i) = *(q + m - 1 + i);//将剩余的字符逐个赋给空字符数组
*(p + i) = '\0';//在结尾手动加上结束符
printf("从第%d个字符开始复制后,结果为:", m);
for (i = 0; i < n - m + 1;i++,p++)
printf("%c", *p);
return 0;
}