字符串的输入和输出函数-集锦
1 - gets
和puts
gets
函数------格式char *gets(char *s);
char arr[1];
gets(arr);
printf("%s", arr);
// 输入h后按下回车键,程序报错,出现字符数组越界的情况,原因是gets接收字符串,在接收h后自动在后面加入\0字符串结束标识。因此字符串长度为2,导致越界。
gets
和scanf
的区别:
gets
函数可以接收空格scanf
函数默认以空格和回车作为结束标志。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
\n
也读入进去,再加上字符串结束标志\0
,当输入的字符长度大于等于指定的长度是,只会读取n-1
个字符,再加上字符串结束标志\0
,不会再读入回车\n
fputs
函数------格式int fputs(const char * str, FILE * stream);
str
所指定的字符串写入到stream
指定的文件中, 字符串结束符 \0
不写入文件。stream
:文件指针,如果把字符串输出到屏幕,固定写为stdout
fputs
函数不会自动输出\n
3 - scanf
和printf
函数
scanf
函数------格式int scanf(const char * __restrict__ _Format,...)
// 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,...);
// 输出为【 he】
char arr[] = "he";
printf("%4s", arr);
//printf("%04s", arr); // 不够前补0,输出【00he】
//printf("%4s", "abcefg"); // 原样输出
printf("%.4s", "abcdefg"); // 输出为abcd
4 - strlen
函数
#include
\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
\0
6 - strnapy
函数------格式:char *strncpy(char *dest, const char *src, size_t n);
7 - strcat
函数------格式:char *strncat(char *dest, const char *src);
#include
\0
也会追加过去,注意:在追加的过程中,dest的字符数组长度要能够容的下追加后的字符和\0
8 - strncat
函数------格式:char *strncat(char *dest, const char *src, size_t n);
\0
也会追加过去9 - strcmp
函数------格式:int strcmp(const char *s1, const char *s2);
\0
结束比较,比较的是字符ASCII码大小。0
,大于为>0
,小于为<0
char arr1[] = "abcd\0ef";
char arr2[] = "abcd";
int val = strcmp(arr1, arr2); // 返回结果为相等0
10 - strncmp
函数------格式:int strncmp(const char *s1, const char *s2, size_t n);
\0
结束比较,比较的是字符ASCII码大小。11 - sprintf
函数------格式:int sprintf(char *str, const char *format, ...);
int a=1,b=2;
char arr[100];
sprintf(arr, "a=%d b=%d", a,b); // arr的结果为"a=1 b=2"
12 - sscanf
函数------格式:int sscanf(const char *str, const char *format, ...);
char arr[] = "a=1,b=2";
int c,d;
sscanf(arr, "a=%d,b=%d",&c,&d); // 结果为c=1 d=2
13 - strchr
函数------格式:char *strchr(const char *s, int c);
14 - strstr
函数------格式:char *strstr(const char *s1, const char *s2);
15 - strtok
函数------char *strtok(char *str, const char *delim);
"w."
,碰见w
和.
都分割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
类型