对字符串操作:
对于标准库中,sting.h 下对字符串操作的函数,以下四个我们非常熟悉,但是常常在应试时,为了考察对字符串和指针的知识点,以及编程逻辑,常会要求能自己用代码实现。
size_t strlen(const char *s) 功能:计算字符串长度,结果不包含'\0'、
char *strcpy(char *dest,const char * src) 功能:拷贝字符串,相当于普通变量的赋值语句,如果目标dest空间不够,可能会产生段错误
char *s strcat(char *dest,const char * src) 功能:把字符串src追加到dest的末尾,相当于普通变量的+=
int strcmp(const char *s1,const char * s2) 功能:比较两个字符串,按首字母顺序(字典序),小的排在前面
s1>s2 返回正值 s1<s2 返回负值 s1 == s2 返回 0
- 以下是自写代码实现上面四个函数:
需加头文件:
#include <stdio.h>
#include <assert.h>
/*功能:计算字符串长度,结果不包含'\0'
输入:要计算的字符串 输出:字符串长度,size_t类型*/
size_t str_len(const char* str)
{
assert(NULL != str); //assert 检查str是否为空,为空会停止程序
const char* tmp = str; //tmp指针指向str字符串首地址
while(*tmp) tmp++; //tmp++,指针+其自身类型长度,即char类型长度,为1,之后tmp指向'\0'跳出循环
return tmp - str; //相减即为字符长度,返回该值
}
/*功能:拷贝字符串,相当于普通变量的赋值语句
输入:要拷贝的字符串src,拷贝到的目标dest 输出:字符串dest*/
char* str_cpy(char* dest,const char* src)
{
assert(NULL!=dest && NULL!=src); //检查是否为空
char* tmp = dest; //使用tmp指针,存储dest的地址
while(*tmp++ = *src++); //对应地址解引用,值传递
return dest;
}
/*功能:把字符串src追加到dest的末尾
输入:字符串dest,src 输出:字符串dest*/
char* str_cat(char* dest,const char* src)
{
assert(NULL!=dest && NULL!=src); //检查是否为空
char* tmp = dest;
while(*tmp)tmp++; //将指针指向字符串'\0'处地址,实现从dest后添加字符
while(*tmp++ = *src++); //相应地址解引用,值传递
return dest; //返回合并后的字符串
}
/*功能:比较两个字符串,按首字母顺序比较
输入:要比较的两个字符串s1,s2
输出:s1>s2 返回正值 ;s1<s2 返回负值 ;s1 == s2 返回 0
*/
int str_cmp(const char* s1,const char* s2)
{
assert(NULL!=s1 && NULL!=s2); //检查是否为空
//从第一位逐个比较,直至对应位出现不同,或者其中一个字符对应位为空
while(*s1 == *s2 && *s1) s1++,s2++;
//比较相同位后面的字符大小
if(*s1 > *s2)
return 1;
if(*s1 < *s2)
return -1;
return 0;
}
- 运行测试
int main(int argc,const char* argv[])
{
printf("%d\n",str_len("hehe"));
char str[20];
puts(str_cpy(str,"hehe----"));
puts(str_cat(str,"++++++"));
printf("%d\n",str_cmp("1235","1234"));
- 测试结果