任务描述:
自己设计函数 :
(1)size_t myStrlen(char *s),返回字符串s的长度。
其中,size_t是在头文件stddef.h中定义的宏类型,实际类型为long unsigned int,在32位系统下,它等价于unsigned类型。
(2)int myStrcmp(char *s1, char *s2),比较字符串s1,s2,返回值为1,0,-1分别表示s1比s2大、s1与s2相等、s1比s2小。
(3)char * myStrcpy(char *dest,char *src ),将字符串src复制到字符串dest。返回dest。
input:
两行字符串 S1,S2,每行不超过100个字符,字符串包括空格和跳格字符。
e.g.
What's your name?
Nice to meet you.
output:
输出3行。(理解对比这一题目含义)
第1行对比输出字符串s1的长度。
第2行对比输出s1与s2比较的结果。
第3行对比输出分别调用自定义myStrcpy(s2,s1 )函数将s1复制到s2,调用库函数strcpy(s3,s1 )将s1复制到s3,后,输出s2,s3。先输出自己函数的输出结果,接着输出一个空格,再输出库函数结果。
e.g.
17 17
1 9(迷惑行为,实际上就是“1”)
What's your name? What's your name?
一些拓展_just see see
字符串比较库函数strcmp()的返回值有两种做法: 做法1:返回-1,0,1分别表示小于、等于、大于的结果。 做法2:返回得出比较结果的位置对应字符的ASCII码差值。正整数、0、负整数。 具体采用哪种函数,依赖于库函数的具体实现。经过测试,Windows下的mingw32-gcc采用做法1,但是Linux下的gcc采用了做法2。 完成本编程任务时,不用理会此差别。
代码如下:
#include <stdio.h> #include <string.h> size_t myStrlen(char * s1); int myStrcmp(char * s1,char *s2); char * myStrcpy(char *dest,char *src); int main() { char s1[101],s2[101],s3[101]; gets(s1); gets(s2); printf("%u %u\n",myStrlen(s1),strlen(s1)); printf("%d %d\n",myStrcmp(s1,s2),strcmp(s1,s2)); myStrcpy(s2,s1); //实质上把S2 清空了再逐个赋值 strcpy(s3,s1); printf("%s %s\n",s2,s3); return 0; size_t myStrlen(char * s1) { size_t i=0; while(s1[i++]) ;//这一行字符串输入完了再退出循环(学学这个地方的技巧 return i-1; //把记录的换行符去掉 } int myStrcmp(char * s1,char *s2) { size_t i; //定义数据类型 for(i=0; s1[i]!='\0'&&s2[i]!='\0'; i++) //逐个逐个比较字符的大小,比出结果直接跳出循环 { if(s1[i]>s2[i]) return 1; else if(s1[i]<s2[i]) return -1; } //以下是:比到相同时,s1 or s2 已经到结尾退出循环的情况分析 if(s1[i]=='\0' && s2[i]=='\0') return 0; else if(s1[i]!='\0' && s2[i]=='\0') //谁短谁就小)逃 return 1; else return -1; } char * myStrcpy(char *dest,char *src) { size_t i,len=myStrlen(src);//确定终点,取长度不用简介访问值,取地址就可以 for(i=0;i<len;i++) dest[i]=src[i]; //就是间接将S1 逐个赋值给 S2 dest[i]='\0'; //别忘了取长度不记录'\0',要手动添加一个结束符'\0' 《很细啊! return dest; }
有时间还要直接手打一遍,确保自己梳理下来,都领悟了