🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # gets ~~~ 参数是个字符数组 char * gets(char *s); ~~~ 使用gets和scanf都要注意缓冲区溢出问题 返回值 * 成功: 读取的字符串 * 失败: NULL ~~~ int main(int argc, char const *argv[]) { char a[100]={ 0 }; gets(a); printf("%s\n", a); return 0; } ~~~ 运行会有个警告,先不用管 * scanf认为回车和空格都代表输入完成,不允许含有空格 * gets认为回车代表输入完成,空格只是字符串一部分 # fgets ~~~ char *fgets(char *s, int size, FILE *stream); ~~~ * 从stream指定的文件内读入字符,保存到指定的内存空间,直到出现换行字符,读到文件结尾或是已经读了size-1个字符为止,最后自动加上字符`'\0'`作为字符串结束 * fgets有三个参数,第一个参数是char的数组,第二个参数是标明这个数组的大小,第三个参数如果是通过键盘输入可以固定写为stdin * 结果: 如果输入的大小小于原始指针对应区域的大小,会在字符串输入完成时自动加上`\n\0`.如果输入的大小小于等于原始指针对应的区域大小,会自动加上`\0`,而不会在加上`\n` gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据.多出来的字符会导致内存溢出,fgets解决了这个问题 由于fgets函数是为读取文件设计的,所以读取键盘输入的时候没有gets方便 ~~~ int main(int argc, char const *argv[]) { char a[10]={ 0 }; fgets(a,sizeof(a),stdin); printf("%s", a); return 0; } ~~~ fgets会认为用户输入的回车也是字符串的一部分 # puts ~~~ #include <stdio.h> int puts(const char *s); ~~~ 返回值 * 成功: 非负数 * 失败: -1 puts函数打印字符串,与printf不同,puts会在最后自动添加一个'\n',puts不支持各种转义字符,比如%d,%s都不支持,puts只能简单的直接输出一个字符串,而不能输出char,int,double等其他类型 ~~~ char s[]="hello world"; puts(s); ~~~ # fputs ~~~ int fputs(const char * str, FILE * stream); ~~~ fputs是puts的文件操作版本 第一个参数是一个char的数组,第二个参数如果只是用puts在屏幕输出的话可以固定写为stdout 返回值 * 成功: 0 * 失败: -1 ~~~ char s[]="hello world"; fputs(s,stdout); ~~~ # strlen 字符串长度 这个库函数需要包含头文件<string.h> ~~~ size_t strlen(const char * _Str); ~~~ **返回不包含字符串结尾'\0'的字符串长度** **建议不要处理字符数组,除非含有'\0'** 我们自己算长度 ~~~ char a[100]="hello"; unsigned int len=0; while(a[len]) { len++; } printf("%u\n", len); ~~~ ~~~ #include <stdio.h> #include <string.h> int main(int argc, char const *argv[]) { char a[100]="hello world"; unsigned int len=0; len=strlen(a); printf("%u\n", len); return 0; } ~~~ # strcat 字符串追加 ~~~ size_t strcat(char * _Str1, const char * _Str2); ~~~ 将参数_Str2追加到_Str1后尾,'\0'也会追加过去 返回 * 成功: 返回dest字符串的首地址 * 失败: NULL ~~~ char a[100]="abc"; char b[100]="123"; //把a和b合并为一个字符串,结果放入a strcat(a,b); printf("%s\n", a); ~~~ 要小写,a的长度和b的长度,不然会内存溢出 # stncat,字符串有限追加 ~~~ size_t strncat(char * _Str1,const char * _Str2,size_t len); ~~~ 在strcat基础上增加了一个参数,这个参数来标明最多可以追加几个char # strcmp 字符串比较 ~~~ int strcmp(const char * _Str1, const char * _Str2); ~~~ 比较的是字符ASCII码大小 返回 相等返回0, 大于:>0, 小于:<0 # strncmp 字符串有限比较 指定比较2个字符串的前几个字符 ~~~ int strncmp(const char * _Str1, const char * _Str2,size_t n); ~~~ n代表指定比较字符串的数量 # strcpy 字符串拷贝 ~~~ char *strcpy(char *_Str1, comst char *_Str2); ~~~ 将参数_Str2拷贝到参数_Str1中,'\0'也会拷贝过去 Strcpy也存在内存溢出的问题 返回 * 成功: 返回dest字符串的首地址 * 失败: NULL # strncpy 字符串有限拷贝 ~~~ char *strncpy(char *_Str1, comst char *_Str2,size n); ~~~ n代表有限拷贝,一般n为`size(char *_Str1)-1` # sprintf 格式化字符串 和printf函数功能类似,printf函数将格式化结果输出到屏幕,**sprintf将格式化结果输出到字符串** ~~~ #include <stdio.h> int sprintf(char *str, const char *format, ...); 功能: 根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符'\0'为止 参数: str:字符串首地址 format:字符串格式,用法和printf()一样 返回值: 成功: 实际格式化的字符个数 失败: -1 ~~~ sprint使用方法和printf类似,唯一区别是增加了第一个参数,第一个参数是一个char数组 ~~~ char a[100]; sprintf(a,"%s","hello world"); printf("%s\n", a); ~~~ # sscanf函数 sscanf类似scanf函数,scanf从键盘读取用户输入,scanf从指定格式化字符串读取输入 sscanf多了第一个参数,char数组,sscanf会从这个char数组中读取相关内容 ~~~ #include <stdio.h> int sscanf(const char *str, const char *format, ...); 功能: 从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据 参数: str: 指定的字符串首地址 format: 字符串格式,用法和scanf()一样 返回值: 成功: 实际读取的字符个数 失败: -1 ~~~ ![](https://box.kancloud.cn/50791830f85e99e2c0de30e47822ca6f_528x255.png) # strchr 查找字符 ~~~ char * strchr(char * _Str,int _Ch); ~~~ 在参数_str中查找_Ch指定字符,找到返回字符_Ch在_Str中所在位置,没有找到返回NULL; ~~~ int main() { char src[] = "dda123sdf"; char *p = strchr(src, 'a'); //如果是汉子用"" printf("p=%s\n", p); //a123sdf if (p != NULL) { printf("找到了\n"); } system("pause"); return EXIT_SUCCESS; } ~~~ # strstr查找字符串 ~~~ int main() { char src[] = "dda123sdf"; char *p = strstr(src, "a123"); printf("p=%s\n", p); //a123sdf system("pause"); return EXIT_SUCCESS; } ~~~ 失败返回NULL # strtok 字符串分割 ~~~ #include<string.h> char *strtok(char *str, const char *delim); ~~~ 功能: 将字符串分割成一个个片段,当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为'\0'字符,当连续出现多个时只替换第一个为'\0' ~~~ int main() { char src[] = "dda123sdf"; char *p = strtok(src, "a123"); printf("p=%s\n", p); //dd system("pause"); return EXIT_SUCCESS; } ~~~ # scanf ~~~ int main() { char arr[100]; int a, b, c; //1. 接收换行结束,可以接收空格 //scanf("%[^\n]", &arr); //printf("%s\n", arr); //2. 在scanf获取数据时,建议不要添加任何字符,空格除外 //scanf("a=%db=%dc=%d", &a, &b, &c); //输入a=1b=2c=3 //printf("%d %d %d\n", a, b, c); //3. 有限定字符宽度的格式化 //scanf("%1d%2d%3d", &a, &b, &c); //printf("%.2f\n", 3.1415); //printf("%d %d %d\n", a, b, c); //补空格 //printf("%4s\n", "ab"); //截取 //printf("%.4s\n", "ab"); //4. 屏蔽数据类型, %d屏蔽数字, %c屏蔽字符 //scanf("%*d%s", arr); //printf("%s\n", arr); //5. 屏蔽一个区间之内的 //scanf("%*[a-z]%c", arr); //printf("%s\n", arr); system("pause"); return EXIT_SUCCESS; } ~~~ # aoti