1. strlen
函数功能 : 计算字符串的长度
注意 : 字符串必须要以 '\0'
结尾
// 原型
size_t strlen(const char* str);
實現方式 ( 三種 )
// 1. 計數器方式
size_t my_strlen(const char* str) {
int count = 0;
assert(str != NULL);
while (*str != '\0') {
count++;
str++;
}
return count;
}
// 2. 指標方式
size_t my_strlen(const char* str) {
char* start = str;
assert(start != NULL);
while (*str != '\0') {
str++;
}
return str - start;
}
// 3. 遞迴
size_t my_strlen(char* str) {
if (*str == '\0') {
return 0;
}
else {
return 1 + my_strlen(str + 1);
}
}
2. strcpy
原型
char* strcpy(char *destination, const char *source);
作用 : Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
注意事项
- 来源字符串必须要以
'\0'
结尾- 会把来源字符串中的
'\0'
一起复制到目标字符串中- 目标字符数组的空间要足够大,以确保来源字符串可以完全复制过去
- 目标字符数组的空间必须可以更改
// 模拟实现
char* my_strcpy (char* dest, const char* sour) {
char* ret = dest;
while (*dest++ = *sour++) {
;
}
return ret;
}
2.1 strncpy
// 原型
char * strncpy ( char * destination, const char * source, size_t num );
函数功能 : 拷贝 num个字符从来原字符串到目标空间
如果来原字符串的长度小于num,则拷贝完来原字符串后,在目标空间后边追加 0 直到num个
3. strcat
// 原型
char * strcat ( char * destination, const char * source );
这个函数的作用就是在目标字符串后追加 source 字符串
注意事项
- 来源字符串必须要以
'\0'
结尾- 目标字符串中也必须要有
'\0'
,不然不知道要从哪开始追加- 目标空间要足够大,足以容纳来源字符串的内容
- 目标空间必须可修改
// 模拟实现
char* my_strcat(char* dest, const char* sour) {
assert(dest && sour);
char* ret = dest;
while (*dest != '\0') {
dest++;
}
while (*dest++ = *sour++) {
;
}
return ret;
}
3.1 strncat
char * strncat ( char * destination, const char * source, size_t num );
函数功能 : 将 source 指向字符串的前 num 个字符追加到 destination 指向的字符串末尾,再追加⼀个 \0
字符
如果 source 指向的字符串的⻓度⼩于 num 的时候,只会将字符串中到
\0
的内容追加到destination指向的字符串末尾
4. strcmp
// 原型
int strcmp ( const char * str1, const char * str2 );
这个函数的作用是比较两个字符串的大小
比较是比较 str1 和 str2 字符的ASCII码值
标准规定的返回值如下
- 第一个字符串大于第二个字符串 返回大于 0 的数字
- 第一个字符串等于第二个字符串 返回 0
- 第一个字符串小于第二个字符串 返回小于 0 的数字
// 模拟实现
int my_strcmp(char* str1, char* str2) {
while (*str1 == *str2) {
if (*str1 == '\0') {
return 0;
}
str1++;
str2++;
}
return (*str1 - *str2);
}
5. strtok
// 原型
char *strtok(char *str1, const char *str2);
这个函数可能相对会比较抽象
它在做的事情是这样的
- sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合
- 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记
- strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。( 注:strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改。)
- strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置
- strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记
- 如果字符串中不存在更多的标记,则返回 NULL 指针。
strtok的操作會使得原本的字符串改變,所以通常會先拷貝一份
#include <stdio.h>
#include <string.h>
int main() {
char arr[] = "cmx@yeah.net";
char buf[256] = { 0 };
strcpy(buf, arr); // 先拷贝一份
char* sep = "@."; // 分割符字符串
char* ret = NULL;
for (ret = strtok(buf, sep); ret != NULL; ret = strtok(NULL, sep)) {
printf("%s\n", ret);
}
return 0;
}
str1
:要被分割的字符串。如果傳入NULL
,表示繼續分割上一個字符串
str2
:包含分隔符的字符串,例如 ",; "
6. strstr
// 原型
char * strstr ( const char * str1, const char * str2);
函数功能 : 函数返回字符串 str2 在字符串 str1 中第⼀次出现的位置
注 : 字符串的⽐较匹配不包含 \0
字符,以 \0
作为结束标志
/* strstr example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="This is a simple string";
char * pch;
pch = strstr (str,"simple");
strncpy (pch,"sample",6);
printf("%s\n", str);
return 0;
}
输出结果
// 模拟实现
char* my_strstr(const char* str1, const char* str2) {
const char* s1 = NULL;
const char* s2 = NULL;
const char* cur = str1;
while (*cur ) { // *cur != '\0'
s1 = cur;
s2 = str2;
//特殊情況 -- str2指向的是空字符串,直接返回str1
if (*str2 == '\0') {
return str1;
}
while (*s1 && *s2 && * s1 == *s2) {
s1++;
s2++;
}
if (*s2 == '\0') {
return cur;
}
cur++;
}
}
7. strerror
strerror函數可以將參數部分錯誤碼對應的錯誤信息的字符串地址返回回來
读者有兴趣可以去看看错误码有哪些
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
FILE * pFile;
pFile = fopen ("unexist.ent","r");
if (pFile == NULL)
printf ("Error opening file unexist.ent: %s\n", strerror(errno));
return 0;
}
Error opening file unexist.ent: No such file or directory
8. perror
和strerror很相似,但perror是直接將錯誤信息打印出來
會先打印冒號 空格再打印錯誤信息
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
FILE * pFile;
pFile = fopen ("unexist.ent","r");
if (pFile == NULL)
perror("Error opening file unexist.ent");
return 0;
}
Error opening file unexist.ent: No such file or directory