C语言中的字符串库函数

C语言中的字符串库函数

van 知其变,守其恒,为天下式.

C语言字符串库函数

在本文中,我们将探讨一些常用的 C 语言字符串库函数,包括 strlen(), strcpy(), strncpy(), strcat(), strncat()strcmp()。对于每个函数,我们将展示其用法,并提供一个自定义的实现。

1. strlen()

strlen()函数接受一个字符串作为参数,并返回字符串的长度。请注意,它不计算结尾的 \0

1
2
strlen("ABC") = 3
strlen("") = 0

下面是一个常用的计算字符串长度的方法:

1
2
3
4
5
const char* p = s;
while(*p){ //搜索字符串的末尾,即`\0`
p++;
}
return p - s;

2. strcpy() & strncpy()

接下来我们来看 strcpy()strncpy() 函数。这两个函数用于复制字符串。

首先是 strcpy() 函数的使用:

1
2
3
char s1[MAXLINE];
strcpy(s1, "Hello World.");
s1[MAXLINE - 1] = '\0';

image-20240503234505992

然后是 strncpy() 函数的使用:

1
2
3
char s2[MAXLINE];
strncpy(s2, "Hello world", MAXLINE - 1);
s2[MAXLINE - 1] = '\0';

image-20240503234553962

下面是 strcpy()strncpy() 的自定义实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
char* my_strcpy(char* s1, const char* s2) {
char* p = s1;
while(*s1++ = *s2++)
;
return p;
}

char* my_strncpy(char* s1, const char* s2, int count) {
char* p = s1;
while((count-- > 0) && (*s1++ = *s2++))
;
return p;
}

3. strcat() & strncat()

接下来我们来看 strcat()strncat() 函数。这两个函数用于连接字符串。

首先是 strcat() 函数的使用:

1
2
char s1[MAXLINE] = "Hello ";
strcat(s1, "world\n");

然后是 strncat() 函数的使用:

1
2
char s2[MAXLINE] = "Hello ";
strncat(s2, "world\n", MAXLINE - strlen(s2) - 1);

下面是 strcat()strncat() 的自定义实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char* my_strcat(char* s1, const char* s2){
char* p = s1;
while(*s1){
s1++;
} //s1 == '\0'
while(*s1++ = *s2++)
;
return p;
}

char* my_strncat(char* s1, const char* s2, size_t count){
char* p = s1;
while(*s1){
s1++;
} //s1 == '\0'
while((count--) && (*s1++ = *s2++))
;
return p;
}

4. strcmp()

最后,我们来看 strcmp() 函数。这个函数用于比较两个字符串。

1
2
printf("strcmp(%s, %s) = %d\n", "ABCDef", "ABCDe", strcmp("ABCDef", "ABCDe"));
// strcmp(ABCDef, ABCDe) = 1

下面是 strcmp() 的自定义实现:

1
2
3
4
5
6
7
8
9
10
11
int my_strcmp(const char* s1, const char* s2){
while(*s1 && *s2){
if(*s1 != *s2){
return *s1 - *s2;
}
s1++;
s2++;
} // *s1 == '\0' || *s2 == '\0'
return *s1 - *s2;
}
// my_strcmp("ABCDef", "ABCDe")最后会跳出while循环并执行return *s1 - *s2;即'f'-'\0',空字符在ascii 码表中值为0

指针常量与常量指针

在学习字符串库函数的过程中,我们经常会遇到“指针常量”和“常量指针”这两个术语。这两个术语可能会引起混淆,特别是在它们的英文表述中,这两个概念的差异更为明显。让我们从英文的角度来解释这两个概念:

1. Pointer to const (指向常量的指针)

这种类型的指针可以指向不同的地址,但不能修改其指向地址处的数据。

1
2
3
4
const int *ptr;  // 指向整型常量的指针
int value = 5;
ptr = &value; // 正确,ptr现在指向value
// *ptr = 10; // 错误,不能通过ptr修改value,因为ptr是指向常量的指针

2. Constant pointer (常量指针)

这种类型的指针一旦初始化后,其存储的地址就不能再被修改,但可以修改其指向地址处的数据。

1
2
3
4
int value = 5;
int *const ptr = &value; // 常量指针,必须在声明时初始化
*ptr = 10; // 正确,可以通过ptr修改value
// ptr = &another_value; // 错误,ptr不能再指向其他地址

总结

  • Pointer to const (“指向常量的指针”):允许改变指针指向的地址,但不允许通过指针修改所指向的数据。
  • Constant pointer (“常量指针”):不允许改变指针的值(即地址),但允许修改指针指向地址处的数据。

通过这种方式理解,可以更清楚地区分这两种类型的指针,并理解它们在实际编程中的用途和限制。

  • Title: C语言中的字符串库函数
  • Author: van
  • Created at : 2024-05-04 00:24:53
  • Updated at : 2024-09-02 00:10:01
  • Link: https://xblog.aptzone.cc/2024/05/04/C语言中的字符串库函数/
  • License: All Rights Reserved © van
Comments