1. 求字符串的长度
strlen
原型:size_t strlen(const char *str);
原理:字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包括'\0')参数指向的字符串必须要以'\0'结束
#include <stdio.h>
#include <string.h>
int main(){
char a[] = "bvsklvjrughkvsknln";//这里就是一个字符串了
printf("The strlen of a = %d",strlen(a));
return 0;
}
注意:函数的返回值为size_t,是无符号的(unsigned int)
2. 长度不受限制的字符串函数
a:strcpy
原型:char * strcpy ( char * destination, const char * source );
原理:strcpy
会从源字符串 src
开始,一个字符一个字符地复制到目标字符串 dest
中,直到遇到字符串结束符 \0
,然后在 dest
也追加一个 \0
来标识字符串的结束。
目标空间(即 dest
)不可变化,必须在复制操作前预先分配足够的内存空间。如果目标空间的大小不足以容纳源字符串,则可能导致缓冲区溢出等严重错误。
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[50]; // 确保目标缓冲区足够大,能够容纳源字符串
strcpy(dest, src);
printf("Copied string: %s\n", dest);
return 0;
}
b:strcat
原型:char * strcat ( char * destination, const char * source );
原理:strcat
从目标字符串 dest
的末尾(即第一个 \0
位置)开始,将源字符串 src
逐字符追加到 dest
后面,并在连接后的字符串末尾添加一个新的 \0
结束符。
注意:使用 strcat
时,目标字符串 dest
必须预留足够的空间, 以便容纳追加后的字符串。 由于strcat
不会自动检查 dest
的剩余空间是否足够,可能会导致缓冲区溢出和潜在的程序崩溃。
#include <stdio.h>
#include <string.h>
int main() {
char dest[50] = "Hello, "; // 确保 dest 的大小足够容纳两个字符串
char src[] = "World!";
strcat(dest, src);
printf("Concatenated string: %s\n", dest);
return 0;
}
c:strcmp
原型:int strcmp ( const char * str1, const char * str2 );
原理:
- 第一个字符串大于第二个字符串时,则返回大于0的数字
- 第一个字符串等于第二个字符串时,则返回0
- 第一个字符串小于第二个字符串时,则返回小于0的数字
#include <stdio.h>
#include <string.h>
int main(){
char a[] = "bvsklvjrughkvsknln";
char b[] = "bvsklvjrughkvsknln";
printf("The strlen of a = %d\n",strlen(a));
printf("The strlen of a = %d\n",strlen(b));
printf("strcmp = %d\n",strcmp(a,b));//返回结果是0
return 0;
}
3. 长度受限制的字符串函数
1.strncpy
原型:char * strncpy ( char * destination, const char * source, size_t num );
原理:拷贝num个字符从源字符串到目标空间,如果源字符串的长度小于num,则补'\0'
#include <stdio.h>
#include <string.h>
int main() {
char str[256] = { 0 };
char str1[] = "hello";
char str2[] = "delicious";
printf("str2=%s", str2);//说明把之前的替换了
// 复制hell
strncpy(str, str1, 4);
printf("str=%s\n", str);
// 复制hello\0\0
strncpy(str2, str1, 7);
printf("str2=%s", str2);
// hello
return 0;
}
2.strncat
原型:char * strncat ( char * destination, const char * source, size_t num );
原理:将一个字符串的指定数量的字符追加到另一个字符串的末尾。与 strcat()
不同的是,strncat()
限制了追加的字符数量,防止超出目标字符串的缓冲区大小。
#include <stdio.h>
#include <string.h>
int main() {
char str[256] = "hello\0xxxxxxxxxx";
char str1[] = "world";
// 拷贝str1的3个字符到str的结尾
strncat(str,str1,3);
printf("str=%s\n",str);
// hellowor
return 0;
}
3.strncmp
原型:int strncmp ( const char * str1, const char * str2, size_t num );
原理:比较两个字符串的前 n
个字符(有一定的限制才能防止内存溢出)与 strcmp()
函数不同,strncmp()
允许你指定比较的字符数,帮助你在部分字符串中进行比较。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello, World!";
char str2[] = "Hello, everyone!";
// 比较前 5 个字符
int result = strncmp(str1, str2, 5);
if (result == 0) {
printf("The first 5 characters are the same.\n");
} else if (result < 0) {
printf("str1 is less than str2 in the first 5 characters.\n");
} else {
printf("str1 is greater than str2 in the first 5 characters.\n");
}
return 0;
}
4. 字符串查找
strstr
原型:char *strstr(const char *haystack, const char *needle);
原理:strstr()
从 haystack
的开头开始,逐字符检查是否存在 needle
。一旦找到匹配的 needle
,它就会返回指向 needle
在 haystack
中第一次出现的位置的指针。如果找到 needle
,返回指向它的指针;如果未找到,则返回 NULL
。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
char *result = strstr(str, "World");
if (result) {
printf("Found: %s\n", result);
} else {
printf("Not found.\n");
}
return 0;
}
strtok
原型 :char *strtok(char *str, const char *delim);
原理: 传入字符串 str
,strtok()
会扫描字符串,找到并返回第一个标记的指针。传入 NULL
作为 str
参数,strtok()
会继续从上一次停止的位置分割并返回下一个标记的指针。返回指向每个标记的指针,最后一次调用时返回 NULL
。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World! Let's tokenize this.";
char *token = strtok(str, " ,.!");//使用指针获取每个被截取到的字符串
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, " ,.!"); // 继续分割传入NULL即可
}
return 0;
}
5. 错误信息报告
strerror
原型:char *strerror(int errnum);
原理:传入错误代码 errnum
,strerror()
会返回对应的错误消息字符串。 返回指向静态错误消息字符串的指针。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
FILE *file = fopen("non_existent_file.txt", "r");
if (file == NULL) {
printf("Error opening file: %s\n", strerror(errno));
}
return 0;
}
- 这是本人的学习笔记不是获利的工具,小作者会一直写下去,希望大家能多多监督我
- 文章会每攒够两篇进行更新发布(受平台原因,也是希望能让更多的人看见)
- 感谢各位的阅读希望我的文章会对诸君有所帮助