字符串一般是用字符数组的方式存储,如:char str[]="123456";
这里str是一个字符数组,它存放了一个字符串“123456”,由于字符串还有一个结束符“\0”,所以此数组的长度为7而不是6.
strcpy函数与memcpy函数:
strcpy函数与memcpy都是标致C库函数,他们有下面的特点:
strcpy:提供了字符串的复制,只用于字符串的复制,并且它不仅复制字符串的内容,还会复制字符串的结束符。
memcpy:提供了一般内存的复制,对于要复制的内容,没有限制,因此用途更广。
不调用库函数实现strcpy函数
#include<stdio.h> char * strcpy(char *strDest,const char * strSrc) { if((strDest==NULL)||(strSrc==NULL)) { return NULL; } char *start = strDest; while(*strSrc!='\0') { *strDest=*strSrc; strDest++; strSrc++; } *strDest = '\0'; return (start); } int main() { char buf[100]; strcpy(buf, "hello c"); printf("%s\n", buf); return 0; }进一步简化,赋值、拷贝\0、指针自增、判断循环终止合并
#include<stdio.h> char * strcpy(char *strDest,const char * strSrc) { if((strDest==NULL)||(strSrc==NULL)) { return NULL; } char *start = strDest; while (*strDest++ = *strSrc++); return (start); } int main() { char buf[100]; strcpy(buf, "hello c"); printf("%s\n", buf); return 0; }实现计算字符串的长度
#include <stdio.h> // 返回字符串长度,失败返回0 int GetStrLen(const char* strSrc) { // 空指针保护 if (strSrc == NULL) { return 0; } int len = 0; // 没读到结束符就计数 while (*strSrc != '\0') { len++; strSrc++; } return len; } int main(void) { char str[] = "abc123"; printf("长度:%d\n", GetStrLen(str)); // 输出6 printf("空串长度:%d\n", GetStrLen("")); // 输出0 printf("空指针:%d\n", GetStrLen(NULL)); // 输出0 return 0; }方法2:
int GetStrLen(const char* strSrc) { if (strSrc == NULL) return 0; const char* p = strSrc; while (*p) // *p != '\0'简写 p++; // 指针相减得到字符个数 return p - strSrc; }原理:
p从头走到\0的位置- 末尾指针 - 起始指针 = 中间有效字符数量
核心逻辑拆解
- 判空:防止传入
NULL解引用崩溃 - 循环条件:
*strSrc != '\0',只要不是结束符说明还有有效字符 - 两种计数思路:
- 变量累加计数器
len++ - 指针偏移后做差值运算(无额外变量,更高效)
- 变量累加计数器