编写一个函数,它从一个字符串中提取一个子字符串。
函数原型如下:
int substr(char dst[], char src[],int start, int len){}
目标是:从 src 数组起始位置向后偏移 start个字符的位置开始,最多复制 len 个非NUL 字符到 dst数组。在复制完毕之后, dst 数组必须以 NUL字节结尾。函数的返回值是存储于 dst 数组中的字符串的长度。
注意指针使用前进行有效性判断(assert头文件为#include<stdio.h>)
代码如下:
#include<stdio.h> #include<assert.h> #include<string.h> #include<stdlib.h> void substr(char dst[], char src[], int start, int len) { assert(dst); assert(src); char *p = src + start; /*定义指针变量指向要提取字符串的地址 while(start) { src++;start--; } */ int n = strlen(p); printf("%d\n", n); /*求出要提取的字符串的长度 if(strlen(str)<len) { len=strlen(src); } */ int i = 0; if (n<len) { len = n; } while (len) { dst[i] = src[start + i];//提取出字符存放在数组dst中 i++; len--; } dst[i] = '\0'; } /*下面代码注意:for循环时不能写成i++,strat++,这样做会使条件(i<end-start)发生变化,造成无法便利完整个字符串。(此处end为子字符串终止时数组标号) void substr(char dst[],char src[],int start,int end) { int i; for(i=0;i<end-start+1;i++) { dst[i]=src[start+i]; } dst[end-start+1]='\0'; } */ int main() { char src[] = "I_love_world!"; char dst[20]; int len, start; printf("请输入要提取字符串的开始处和长度\n"); scanf("%d%d", &start, &len); substr(dst, src, start-1, len);//传的是下标,故减1 printf("%d\n", strlen(dst));//输出要提取的字符串的长度 printf("%s\n", dst);//输出提取的字符串 system("pause"); return 0; }