一、字符串的输入和输出函数-集锦
📝
-
1 -
gets
和puts
gets
函数------格式char *gets(char *s);
- 1、可以接收空格,直到出现换行符或读到文件结尾为止。
char arr[1]; gets(arr); printf("%s", arr); // 输入h后按下回车键,程序报错,出现字符数组越界的情况,原因是gets接收字符串,在接收h后自动在后面加入\0字符串结束标识。因此字符串长度为2,导致越界。
- 2、
gets
和scanf
的区别:gets
函数可以接收空格scanf
函数默认以空格和回车作为结束标志。
- 1、可以接收空格,直到出现换行符或读到文件结尾为止。
puts
函数------格式int puts(const char *s);
- 会在输出字符串结束后自动输处换行
\n
- 会在输出字符串结束后自动输处换行
-
2 -
fgets
和fputs
函数fgets
函数------格式char *fgets(char *s, int size, FILE *stream);
- 从
stream
指定的文件内读入字符,保存到s所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1
个字符为止,最后会自动加上字符\0
作为字符串结束。 size
:指定最大读取字符串的长度(size - 1)
stream
:文件指针,如果读键盘输入的字符串,固定写为stdin
- 1、可以接收空格,当输入的字符长度小于指定的长度时,会连
\n
也读入进去,再加上字符串结束标志\0
,当输入的字符长度大于等于指定的长度是,只会读取n-1
个字符,再加上字符串结束标志\0
,不会再读入回车\n
- 从
fputs
函数------格式int fputs(const char * str, FILE * stream);
- 将
str
所指定的字符串写入到stream
指定的文件中, 字符串结束符\0
不写入文件。 stream
:文件指针,如果把字符串输出到屏幕,固定写为stdout
- 1、
fputs
函数不会自动输出\n
- 将
-
3 -
scanf
和printf
函数scanf
函数------格式int scanf(const char * __restrict__ _Format,...)
- 接收从控制台输入的字符或字符串
- 1、以空格或者回车作为结束标志
- 2、严格的输入格式,双引号中写什么格式,输入时就要什么格式
// 1、scanf接收数据时,建议不要添加任何字符,空格除外,输入1 2 3回车,或者1回车2回车3回车 int a,b,c; scanf("%d %d %d", &a,&b,&c); // 2、定义格式化是什么格式,输入就得是什么格式,输入时必须得是:a=1,b=2,c=3格式 int a,b,c; scanf("a=%d,b=%d,c=%d", &a,&b,&c); // 2、接收整型,有限定字符宽度的格式化,输入123456789,输出的是a=1,b=23,c=456 int a,b,c; scanf("%1d%2d%3d", &a,&b,&c); // 3、接收字符型,有限定字符宽度的格式化,输入abcdefghijklmn,输出的是arr1=abcd,arr2=ef char arr1[100],arr2[100]; scanf("%4s%2s", arr1, arr2); // 2、定义格式化输入""中有空格,输入一个数后输入空格或者回车不会结束,必须输入两个数才能结束 int a; scanf("%d ", &a); // 3、定义格式化输入""中有\n,输入一个数后输入空格或者回车不会结束,必须输入两个数才能结束 int a; scanf("%d\n", &a); // 4、想让scanf接收空格,这样的意思是:接收字符,直到碰到\n停止 char arr[100]; scanf("%[^\n]", arr); // 5、想让scanf碰到数字就结束,输入123abc,接收结果为:没有接收任何字符,数组中的值还是初始化的值,输入abc123efg456,接收结果为:接收abc,再加上\0结束标志 char arr[100]; scanf("%[^0-9]", arr); // 6、屏蔽字符`%*d`--屏蔽数字,输入abc123efg456,什么也不接收,因为字符串以字母开头,输入123abc456efg,接收abc456efg,再加上\0结束标志,总结一句话:遇见*,得按照它的格式输入,否则什么也不接收 char arr[100]; scanf("%*d%s", arr); // 7、屏蔽字符`%*c`--屏蔽一个字符,输入abc123efg456,接收bc123efg456,输入123abc456efg,接收23abc456efg char arr[100]; scanf("%*c%s", arr); // 8、屏蔽字母a-z,格式:`%*[a-z]`,输入123abc456,什么也不接收,输入abc123efg456,接收123efg456 char arr[100]; scanf("%*[a-z]%s", arr);
printf
函数------格式:int printf(const char * __restrict__ _Format,...);
- 1、格式化输出-字符串,.前为补空格
// 输出为【 he】 char arr[] = "he"; printf("%4s", arr); //printf("%04s", arr); // 不够前补0,输出【00he】 //printf("%4s", "abcefg"); // 原样输出
- 2、格式化输出-字符串,.后为截取
printf("%.4s", "abcdefg"); // 输出为abcd
- 1、格式化输出-字符串,.前为补空格
-
4 -
strlen
函数- 需要导入头文件
#include <string.h>
- 计算字符串的有效长度,不包括
\0
- 如果一个字符数组没有包括
\0
,那么它的计算长度,为直到找到\0为止char arr[] = {'h', 'e', 'l', 'l', 'o'} printf("%d", strlen(arr)) // 计算结果为直到找到`\0`为止
- 需要导入头文件
-
5 -
strcpy
函数------格式:char *strcpy(char *dest, const char *src);
- 需要导入头文件
#include <string.h>
- 将源字符串复制到目的字符串中,复制时,复制字符串结束标志
\0
- 需要导入头文件
-
6 -
strnapy
函数------格式:char *strncpy(char *dest, const char *src, size_t n);
- 把src指向字符串的前n个字符复制到dest所指向的空间中,是否拷贝结束符看指定的长度是否包含’\0’。
-
7 -
strcat
函数------格式:char *strncat(char *dest, const char *src);
- 需要导入头文件
#include <string.h>
- 将src字符串前n个字符连接到dest的尾部,
\0
也会追加过去,注意:在追加的过程中,dest的字符数组长度要能够容的下追加后的字符和\0
- 需要导入头文件
-
8 -
strncat
函数------格式:char *strncat(char *dest, const char *src, size_t n);
- 将src字符串前n个字符连接到dest的尾部,
\0
也会追加过去
- 将src字符串前n个字符连接到dest的尾部,
-
9 -
strcmp
函数------格式:int strcmp(const char *s1, const char *s2);
- 比较 s1 和 s2 的大小,遇到
\0
结束比较,比较的是字符ASCII码大小。 - 等于为
0
,大于为>0
,小于为<0
char arr1[] = "abcd\0ef"; char arr2[] = "abcd"; int val = strcmp(arr1, arr2); // 返回结果为相等0
- 比较 s1 和 s2 的大小,遇到
-
10 -
strncmp
函数------格式:int strncmp(const char *s1, const char *s2, size_t n);
- 比较 s1 和 s2 前n个字符的大小,遇到
\0
结束比较,比较的是字符ASCII码大小。
- 比较 s1 和 s2 前n个字符的大小,遇到
-
11 -
sprintf
函数------格式:int sprintf(char *str, const char *format, ...);
- 根据参数format字符串格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符 ‘\0’ 为止。
int a=1,b=2; char arr[100]; sprintf(arr, "a=%d b=%d", a,b); // arr的结果为"a=1 b=2"
- 根据参数format字符串格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符 ‘\0’ 为止。
-
12 -
sscanf
函数------格式:int sscanf(const char *str, const char *format, ...);
- 从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。
char arr[] = "a=1,b=2"; int c,d; sscanf(arr, "a=%d,b=%d",&c,&d); // 结果为c=1 d=2
- 从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。
-
13 -
strchr
函数------格式:char *strchr(const char *s, int c);
- 在字符串s中查找字母c出现的位置,成功返回第一次出现的c地址,失败返回NULL
-
14 -
strstr
函数------格式:char *strstr(const char *s1, const char *s2);
- 在字符串s1中查找字符串s2出现的位置,成功返回第一次出现的s2地址,失败返回NULL
-
15 -
strtok
函数------char *strtok(char *str, const char *delim);
- 来将字符串分割成一个个片段。当strtok()在参数str的字符串中发现参数delim中包含的分割字符时, 则会将该字符改为\0 字符,当连续出现多个时只替换第一个为\0。当首字母出现要分割的字符时,忽略首字母,不把首字母换成\0字符,继续向下寻找,直到找到要分割的字符为止。
- 当要分割的字符为多个时,例如
"w."
,碰见w
和.
都分割 - 分割成功后返回分割字符串的首地址,失败返回NULL
- 在第一次调用时:
strtok()
必需给予参数str
字符串,往后的调用则将参数str
设置成NULL
,每次调用成功则返回指向被分割出片段的指针char arr[] = "http://www.baidu.com"; char *p = strtok(arr, ":"); while(p!=NULL){ printf("%s\n", p); p = strtok(NULL, "w."); }
-
16 -
atoi、atof、atol
函数------格式:int atoi(const char *nptr);
atoi()
会扫描nptr
字符串,跳过前面的空格字符,直到遇到数字或正负号才开始做转换,而遇到非数字或字符串结束符(\0
)才结束转换,并将结果作为返回值。atoi
将字符串转换为int
类型atof
将字符串转换为double
类型atol
将字符串转换为long
类型