C语言字符串处理相关笔记
gets()
函数原型:
1 | char * gets (char *__str); |
功能:从标准输入读入字符,并保存到__str
指定的内存空间,直到出现换行符或读到文件结尾为止。
参数:s 字符串首地址。
返回值:
成功:读入的字符串。
失败:NULL
例子:
1 | void string_test(void) |
调用该函数会提示警告是危险的函数,可以使用 fgets()
。
1 | call to 'gets' declared with attribute warning: Using gets() is always unsafe - use fgets() |
fgets()
头文件:#include<stdio.h>
函数原型:
1 | char * fgets (char *__restrict__ __s, int __n, FILE *__restrict__ __stream); |
功能:从stream
指定的文件内读入字符,保存到__s
所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1
个字符为止,最后会自动加上字符 \0
作为字符串结束。
参数:
- __s 字符串
- __n 指定最大读取字符串的长度
- __stream 文件指针,如果读键盘输入的字符串,固定写为stdin
返回值:
- 成功 成功读取的字符串
- 读到文件尾或出错 NULL
描述:
fgets()
在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也做为字符串的一部分。通过scanf
和gets
输入一个字符串的时候,不包含结尾的\n
,但通过fgets结尾多了\n
。fgets()
函数是安全的,不存在缓冲区溢出的问题。
例子:
1 | void string_test(void) |
输出:
1 | E:\work\code\c_dev\c_learn\build\demos [main ≡ +6 ~11 -5 !]> ."E:/work/code/c_dev/c_learn/build/demos/DEMOS.exe" |
可以看到,如果输入的长度大于 10 时,会自动截取。
puts()
函数原型:
1 | int puts(const char *_Str); |
在标准输出输出字符串 _Str
,在在输出完成后自动加一个 \n
。
返回值:
- 成功 非负值
- 失败 -1
fputs()
函数原型:
1 | int fputs(const char * __restrict__ _Str,FILE * __restrict__ _File); |
功能:将_Str
所指定的字符串写入到stream
指定的文件中,字符串结束符\0
不写入文件。
参数:
- _Str 要输出的字符串
- _File 文件指针,如果把字符串输出到屏幕,固定写为
stdout
。
返回值:
- 成功 0
- 失败 -1
注意:fputs()
是puts()
的文件操作版本,但fputs()
不会自动输出一个\n
。
例子:
1 | fputs(">>> Hello,World!", stdout); |
strlen()
头文件:#include <string.h>
函数原型:
1 | size_t strlen(const char *_Str); |
功能:算指定指定字符串_Str
的长度,不包含字符串结束符\0
。
返回值:字符串的长度
例子:
1 | puts("请输入一些内容:"); |
输出:
1 | E:\work\code\c_dev\c_learn\build\demos [main ≡ +6 ~11 -5 !]> ."E:/work/code/c_dev/c_learn/build/demos/DEMOS.exe" |
strcpy()
头文件:#include <string.h>
函数原型:
1 | char *strcpy(char *__restrict__ _Dest, const char *__restrict__ _Source); |
功能:把_Source
所指向的字符串复制到_Dest
所指向的空间中,\0
也会拷贝过去。
返回值:
- 成功 返回
_Dest
字符串的首地址。 - 失败 NULL
注意:如果参数_Dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。
例子:
1 | char s[10]; |
strncpy()
函数原型:
1 | char * strncpy(char * __restrict__ __dst, const char * __restrict__ __src, size_t __n); |
和 strcpy() 类似,只是多了一个参数。
功能:把__src
指向字符串的前n
个字符复制到__dst
所指向的空间中,是否拷贝结束符看指定的长度是否包含\0
。
返回值:
- 成功 返回
__dst
字符串的首地址。 - 失败 NULL
注意:strncpy() 可能会导致字符串乱码。
strcat()
函数原型:
1 | char * strcat(char * __restrict__ __dst, const char * __restrict__ __src); |
功能:将__src
字符串连接到__dst
的尾部,\0
也会追加过去。
返回值:
- 成功 返回
__dst
字符串的首地址。 - 失败 NULL
strncat()
功能:将__src
字符串前n
个字符连接到__dst
的尾部,\0
也会追加过去。
返回值:
- 成功 返回
__dst
字符串的首地址。 - 失败 NULL
strcmp()
函数原型:
1 | int __cdecl strcmp(const char *_Str1,const char *_Str2); |
功能: 比较 _Str1 和 _Str2 的大小,比较的是字符ASCII码大小。
返回值:
- 相等:0
- 大于:>0
- 小于:<0
strncmp()
函数原型:
1 | int __cdecl strncmp(const char *_Str1,const char *_Str2,size_t _MaxCount); |
功能: 比较 _Str1 和 _Str2 前n个字符的大小,比较的是字符ASCII码大小。
sprintf()
函数原型:
1 | int sprintf (char *__stream, const char *__format, ...); |
功能:根据参数__format
字符串来转换并格式化数据,然后将结果输出到__stream
指定的空间中,直到出现字符串结束符 \0
为止。
例子:
1 | int x = 10; |
sscanf()
函数原型:
1 | int sscanf(const char *__source, const char *__format, ...); |
例子:
1 | char src[] = "张三 15"; |
输出:
1 | E:\work\code\c_dev\c_learn\build\demos [main ≡ +6 ~11 -5 !]> ."E:/work/code/c_dev/c_learn/build/demos/DEMOS.exe" |
参考:
strchr()
函数原型:
1 | char * strchr(const char *_Str,int _Val); |
功能:在字符串_Str
中查找字母_Val
出现的位置。
返回值:
- 成功:返回第一次出现的
_Val
地址 - 失败:
NULL
例子:
1 | char src[] = "hello123_world%你好"; |
输出:
1 | E:\work\code\c_dev\c_learn\build\demos [main ≡ +6 ~11 -5 !]> ."E:/work/code/c_dev/c_learn/build/demos/DEMOS.exe" |
strstr()
函数原型:
1 | char * strstr(const char *_Str,const char *_SubStr); |
功能:在字符串_Str
中查找字符串_SubStr
出现的位置。
参数:
- _Str:源字符串首地址
- _SubStr:匹配字符串首地址
返回值:
成功:返回第一次出现的_SubStr地址
失败: NULL
例子:
1 | char src1[] = "hello123_world%你好"; |
输出:
1 | E:\work\code\c_dev\c_learn\build\demos [main ≡ +6 ~11 -5 !]> ."E:/work/code/c_dev/c_learn/build/demos/DEMOS.exe" |