memset()
string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
<string.h>
是 C 标准库中的一个头文件,提供了一组用于处理字符串和内存块的函数。这些函数涵盖了字符串复制、连接、比较、搜索和内存操作等。
描述
void *memset(void *str, int c, size_t n)
参数 | 说明 |
*str | 指向要填充的内存区域的指针,使用时需要确保 ptr 指向的内存区域足够大,避免发生越界访问 |
c | 要设置的值,通常是一个无符号字符,通常是一个 int 类型的值,但实际上只使用了该值的低8位。这意味着在范围 0 到 255 之外的其他值可能会产生未定义的行为 |
n | 要被设置为该值的字节数,通常是通过 sizeof() 或其他手段计算得到的 |
sizeof()
sizeof() 函数是一个运算符而不是函数,用于计算一个类型或变量所占用的内存字节数。可以用它来获取任何类型的数据的字节数,包括基本数据类型、数组、结构体、共用体等等。
语法形式
sizeof
运算符有两种使用形式:
- 计算数据类型的大小:
sizeof(数据类型)
- 计算变量的大小:
sizeof(变量名)
或者sizeof 变量名
sizeof(int) // 输出 4,即整型变量占用 4 个字节
int x;
sizeof(x) // 输出 4,即整型变量 x 占用 4 个字节
char s[] = "Hello, world!";
sizeof(s) // 输出 14,即字符串 s 中有 14 个字符(包括结尾的空字符 '\0')
memset() 函数将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中,这可以用于将内存块清零'\0' 或设置为特定值。
实例1
#include <stdio.h>
#include <string.h>
int main()
{
char buffer[100];
// 将buffer数组的所有元素初始化为 '\0'
memset(buffer, '\0', sizeof(buffer));
return 0;
}
实例2
#include <stdio.h> //包含标准输入输出库的头文件,以便使用puts函数进行输出操作
#include <string.h> //包含字符串处理函数的头文件,这里使用的strcpy和memset函数都声明在这个头文件中
int main ()
{
// 定义一个大小为50的字符数组
char str[50];
// 使用strcpy函数将字符串复制到str数组中
strcpy(str,"This is string.h library function");
// 使用puts函数输出字符串
puts(str);
// 使用memset函数将str数组的前7个字符设置为'$'
memset(str,'$',7);
// 再次使用puts函数输出修改后的字符串
puts(str);
return(0);
}
打印结果
This is string.h library function
$$$$$$$ string.h library function
在一些情况下,需要快速初始化大块内存为零或者特定值,memset() 可以提供高效的实现。在清空内存区域或者为内存区域赋值时,memset() 是一个常用的工具函数。
#include <stdio.h>
#include <string.h>
int main()
{
char buffer[10];
// 将 buffer 数组的前5个字节设置为字符 'A',并添加字符串终止符
memset(buffer, 'A', 5);
buffer[5] = '\0'; // 确保添加字符串终止符
printf("Buffer after memset: %s\n", buffer);
// 将 buffer 数组清零,使用 '\0' 替代 0
memset(buffer, '\0', sizeof(buffer)); // 使用'\0'确保一致性及可读性
printf("Buffer after memset: %s\n", buffer);
return 0;
}
打印结果
Buffer after memset: AAAAA
Buffer after memset:
注意事项
- 字符串结束标志:使用
%s
输出字符串时,函数会从指定的字符串起始地址开始输出字符,直到遇到字符串结束标志'\0'
才会停止。所以,确保字符串以'\0'
结尾是很重要的,不然可能会输出多余的字符。 - 参数匹配:在使用
%s
时,对应的参数必须是一个指向以'\0'
结尾的字符数组(也就是字符串)的指针。如果参数类型不匹配,可能会导致未定义行为。
strlen()
描述
C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
size_t
是 C 和 C++ 编程语言里的一种数据类型,主要用于表示对象的大小或者数组的长度。
const
是一个类型修饰符,其主要作用是把变量或者对象声明为常量,以此来保证它们的值在程序运行期间不会被修改。
size_t strlen(const char *str)
参数 | 说明 |
*str | 要计算长度的字符串 |
返回值:该函数返回字符串的长度。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
// 定义一个大小为 50 的字符数组 str,用于存储字符串
char str[50];
// 定义一个整型变量 len,用于存储字符串的长度
int len;
// 使用 strcpy 函数将字符串 "This is runoob.com" 复制到字符数组 str 中
// strcpy 函数的原型是 char *strcpy(char *dest, const char *src);
// 它会把 src 指向的字符串复制到 dest 指向的数组中,并且会复制字符串结束标志 '\0'
strcpy(str, "This is runoob.com");
// 使用 strlen 函数计算字符数组 str 中字符串的长度
// strlen 函数的原型是 size_t strlen(const char *s);
// 它会从 s 指向的字符开始,逐个字符计数,直到遇到字符串结束标志 '\0' 为止
// 注意,strlen 计算的长度不包括字符串结束标志 '\0'
len = strlen(str);
// 使用 printf 函数输出字符串及其长度
// %s 是格式说明符,用于输出字符串
// %d 是格式说明符,用于输出十进制整数
printf("|%s| 的长度是 |%d|\n", str, len);
// main 函数返回 0,表示程序正常结束
return(0);
}
打印结果
|This is runoob.com| 的长度是 |18|
sizeof() 和 strlen()区别:C 语言关于sizeof() 和 strlen()区别 | 菜鸟教程
strstr()
描述
C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 \0。
char *strstr(const char *haystack, const char *needle);
参数 | 说明 |
*haystack | 要被搜索的主字符串,即较大的字符串,通常是一个以 '\0' 结尾的字符数组。该参数被声明为 const char * ,表示函数不会修改这个字符串的内容 |
*needle | 要查找的子字符串,同样是一个以 '\0' 结尾的字符数组 |
strstr() 函数用于在字符串 haystack 中查找子字符串 needle 的第一次出现位置。如果找到,则返回指向该位置的指针;如果未找到,则返回 NULL。
返回值
- 如果在
haystack
中找到了needle
子字符串,函数返回一个指向needle
在haystack
中首次出现位置的指针。 - 如果
needle
是空字符串,则返回haystack
本身。 - 如果在
haystack
中没有找到needle
子字符串,则返回NULL
。
实例
#include <stdio.h>
#include <string.h>
int main() {
// 定义一个指向常量字符的指针 haystack,
// 并初始化为一个包含多个字符的字符串,作为被搜索的主字符串
const char *haystack = "Hello, World! This is a test.";
// 定义一个指向常量字符的指针 needle,
// 并初始化为一个较短的字符串,作为要在主字符串中查找的子字符串
const char *needle = "World";
// 调用 strstr 函数,该函数用于在 haystack 中查找 needle 首次出现的位置
// 若找到,返回指向该位置的指针;若未找到,返回 NULL
// 将函数返回结果存储在指针变量 result 中
char *result = strstr(haystack, needle);
// 判断 result 是否不为 NULL,即是否找到了子字符串
if (result != NULL) {
// 如果找到了子字符串,使用 printf 函数输出信息
// 输出子字符串及其在主字符串中首次出现位置开始的后续内容
printf("子字符串 '%s' 在主字符串中首次出现的位置是: %s\n", needle, result);
} else {
// 如果未找到子字符串,使用 printf 函数输出提示信息
printf("未找到子字符串 '%s'\n", needle);
}
// main 函数返回 0,表示程序正常结束
return 0;
}
打印结果
子字符串 'World' 在主字符串中首次出现的位置是: World! This is a test.
strcat()
描述
strcat()
是 C 语言标准库 <string.h>
中的一个函数,其作用是将一个字符串追加到另一个字符串的末尾
char *strcat(char *dest, const char *src);
C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
参数 | 说明 |
*dest | 目标字符串,也就是要被追加内容的字符串。它必须是一个足够大的字符数组,以容纳原字符串和要追加的字符串以及字符串结束符 '\0' |
*src | 源字符串,即要追加到目标字符串末尾的字符串,该字符串不会覆盖目标字符串 |
返回值:函数返回一个指向目标字符串 dest
的指针,方便进行链式调用。
实例
#include <stdio.h>
#include <string.h>
int main() {
char dest[50] = "Hello, ";
const char *src = "World!";
// 调用 strcat 函数将 src 追加到 dest 的末尾
strcat(dest, src);
printf("拼接后的字符串是: %s\n", dest);
return 0;
}
工作原理
strcat()
函数会先找到目标字符串 dest
的末尾(即 '\0'
字符的位置),然后将源字符串 src
的内容复制到该位置,包括 src
的字符串结束符 '\0'
。
注意事项
- 目标数组大小:使用
strcat()
时,必须确保目标数组dest
有足够的空间来容纳源字符串src
。如果dest
数组空间不足,会导致缓冲区溢出,这是一个严重的安全问题。 - 字符串结束符:目标字符串
dest
必须以'\0'
结尾,否则strcat()
函数可能无法正确找到字符串的末尾,从而导致未定义行为。
strcpy()
描述
strcpy()
是 C 语言标准库 <string.h>
中的一个函数,用于将一个字符串复制到另一个字符数组中
char *strcpy(char *dest, const char *src);
作用:把 src 所指向的字符串复制到 dest。
参数 | 说明 |
*dest | 指向用于存储复制内容的目标数组,也就是要将字符串复制到的地方。它必须有足够的空间来容纳源字符串(包含字符串结束符 '\0' ) |
*src | 要复制的字符串,是一个以 '\0' 结尾的字符序列,函数会将其内容复制到目标数组中 |
返回值:函数返回一个指向目标字符数组 dest
的指针,这样设计方便进行链式调用。
实例
#include <stdio.h>
#include <string.h>
int main() {
char dest[20];
const char *src = "Hello, World!";
// 调用 strcpy 函数将 src 复制到 dest
strcpy(dest, src);
printf("复制后的字符串是: %s\n", dest);
return 0;
}
工作原理
strcpy()
函数会从源字符串 src
的起始位置开始,逐个字符地将字符复制到目标数组 dest
中,直到遇到源字符串的结束符 '\0'
。复制完成后,结束符 '\0'
也会被复制到目标数组中,以此确保目标数组存储的是一个合法的字符串。
注意事项
- 目标数组大小:使用
strcpy()
时,要保证目标数组dest
有足够的空间来存储源字符串及其结束符。如果dest
数组空间不足,会引发缓冲区溢出问题,这是一种严重的安全隐患。 - 覆盖原有内容:
strcpy()
会覆盖目标数组dest
中原有的内容。如果dest
之前已经存储了数据,复制操作会将其覆盖。
puts()
puts()
是 C 语言标准库 <stdio.h>
中的一个函数,主要用于将字符串输出到标准输出设备(通常是控制台),并在输出结束后自动添加一个换行符
int puts(const char *s);
s
:指向要输出的字符串的指针,该字符串必须以空字符 '\0'
结尾 。
返回值
- 如果输出成功,
puts()
函数返回一个非负整数(通常是一个表示成功输出的正数)。 - 如果输出过程中发生错误,函数返回
EOF
(通常定义为 -1),EOF
是<stdio.h>
中定义的一个宏,用于表示文件结束或输入输出错误。
实例
#include <stdio.h>
int main()
{
const char *message = "Hello, World!";
int result = puts(message);
if (result == EOF) {
printf("输出过程中发生错误。\n");
} else {
printf("字符串输出成功。\n");
}
return 0;
}
工作原理
puts()
函数会从指针 s
所指向的位置开始,逐个字符地输出字符串,直到遇到字符串结束符 '\0'
为止。在输出完字符串后,它会自动在末尾添加一个换行符 '\n'
,这意味着每次调用 puts()
后,下一次的输出会从新的一行开始。
与 printf()
的比较
- 功能差异:
puts()
主要用于输出字符串并自动添加换行符,功能相对单一;而printf()
是一个格式化输出函数,可以根据格式说明符输出不同类型的数据,功能更加灵活和强大。 - 使用场景:如果只需要输出一个字符串并换行,使用
puts()
会更简洁;如果需要对输出进行格式化,例如输出不同类型的数据、控制输出的宽度和精度等,则应该使用printf()
。
atoi()
描述
int atoi(const char *nptr);
作用:把参数 nptr 所指向的字符串转换为一个整数(类型为 int 型)。
nptr
:这是一个指向要转换的字符串的指针。该字符串可以包含可选的前导空白字符(如空格、制表符等),接着可以是一个可选的正负号(+
或-
),然后是一系列的数字字符。函数会尝试将这样的字符串转换为对应的整数值。
返回值
- 若字符串能够成功转换为整数,
atoi()
函数会返回转换后的整数值。 - 若字符串不能被正确转换,比如字符串中不包含有效的数字字符,函数会返回 0。
实例1
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *str1 = "12345";
const char *str2 = " -678";
const char *str3 = "abc123";
int num1 = atoi(str1);
int num2 = atoi(str2);
int num3 = atoi(str3);
printf("字符串 '%s' 转换后的整数是: %d\n", str1, num1);
printf("字符串 '%s' 转换后的整数是: %d\n", str2, num2);
printf("字符串 '%s' 转换后的整数是: %d\n", str3, num3);
return 0;
}
打印结果
字符串 '12345' 转换后的整数是: 12345
字符串 ' -678' 转换后的整数是: -678
字符串 'abc123' 转换后的整数是: 0
注意事项
- 溢出问题:
atoi()
函数不会对转换结果进行溢出检查。如果字符串表示的数值超出了int
类型的取值范围,会产生未定义行为。 - 错误处理:
atoi()
函数在遇到无法转换的字符串时只会返回 0,无法明确区分是字符串表示的数值为 0 还是转换失败。
printf()函数
printf()规定符
- %d 十进制有符号整数
- %u 十进制无符号整数
- %f 浮点数
- %s 字符串
- %c 单个字符
- %p 指针的值
- %e 指数形式的浮点数
- %x, %X 无符号以十六进制表示的整数
- %o 无符号以八进制表示的整数
- %g 把输出的值按照 %e 或者 %f 类型中输出长度较小的方式输出
- %p 输出地址符
- %lu 32位无符号整数
- %llu 64位无符号整数
- %% 输出百分号字符本身。
上述部分笔记来自C库函数-菜鸟教程