C 字符串操作函数
2016-07-10 18:58
381 查看
针对C风格的字符串(char p
;):
长度(strlen)、追加(strcat, strncat)、比较(strcmp, strncmp)、查找(strchr, strstr)等。
--带n的版本,是有限操作,而非全部操作。例如strcmp 是对比两个字符串,而strncmp 则是对比两个字符串的前n个字符。
--追加应该使用strncat,因为strcat 有溢出的危险。(奇怪的是,strcat 在我的minGW32 - gcc 4.9.3这里没有提示错误。)
输入(scanf、gets、fgets、sscanf)、输出(printf、puts、fputs、sprintf)。
--scanf 也存在溢出的可能,且会将空白(空格、回车等)当成输入终止。
--gets 只会将回车当成输入终止。但它也存在溢出可能。
--fgets 是安全的。
--sscanf 是将字符串中的内容读取到指定的变量中!和 sprintf 相反。
--sprintf 则是将一串内容输出到指定的字符串!!
还有一个 atoi 函数,可以将字符串转成int 。(atof--转成浮点数,其他略)
--a 应该是 char array的意思。
注意:上面说的溢出,都是目标字符数组的长度 无法容纳最终的结果导致的。
代码如下:
;):
长度(strlen)、追加(strcat, strncat)、比较(strcmp, strncmp)、查找(strchr, strstr)等。
--带n的版本,是有限操作,而非全部操作。例如strcmp 是对比两个字符串,而strncmp 则是对比两个字符串的前n个字符。
--追加应该使用strncat,因为strcat 有溢出的危险。(奇怪的是,strcat 在我的minGW32 - gcc 4.9.3这里没有提示错误。)
输入(scanf、gets、fgets、sscanf)、输出(printf、puts、fputs、sprintf)。
--scanf 也存在溢出的可能,且会将空白(空格、回车等)当成输入终止。
--gets 只会将回车当成输入终止。但它也存在溢出可能。
--fgets 是安全的。
--sscanf 是将字符串中的内容读取到指定的变量中!和 sprintf 相反。
--sprintf 则是将一串内容输出到指定的字符串!!
还有一个 atoi 函数,可以将字符串转成int 。(atof--转成浮点数,其他略)
--a 应该是 char array的意思。
注意:上面说的溢出,都是目标字符数组的长度 无法容纳最终的结果导致的。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char const *argv[]) { char s1[15]="hello world"; char s2[15]="abc defxxx"; strcat(s1, s2); //追加 // strncat(s1, s2, strlen(s2)); printf("%s\n", s1); int v = strcmp(s1, s2); //比较 printf("%d\n", v); char s3[]="hello"; char s4[]="hello"; if( s3 != s4){ //应该比较的是地址 printf("%s != %s\n", s3, s4); } char s5[]="helloaaa"; char s6[]="hellobbb"; v = strncmp(s5, s6, 5); //比较前5个字符 printf("%d\n", v); strcpy(s5, s6); printf("%s, %s\n", s5, s6); strncpy(s1, s2, 3);//拷贝前几位 printf("%s, %s\n", s1, s2); int i = 200; char ss[100]={0}; sprintf(ss, "i = %d", i);//把要输出的内容输出到string中? printf("%s\n", ss); // ss=itoa(i); //不是标准的c语言库函数。vs有 //atoi是标准的c语言库函数 char s7[100]="abc=500"; char s8[100]="5+6="; sscanf(s7, "abc=%d", &i); //利用字符串作为输入,输出指定内容到指定变量。 printf("%d\n", i); int a,b; sscanf(s8, "%d+%d=", &a, &b); printf("%d, %d\n", a, b); const char *p = strchr(s7, '='); //查找字符 printf("%s\n", p); p = strstr(s7, "b"); //查找字符串 printf("%s\n", p); strcpy(s7, "abc_123_ee_xx"); p=strtok(s7, "_"); //将_替换成0 // printf("%s, %p, %p\n", p, p, s7); // p=strtok(NULL, "_"); //怎么知道是对哪个操作的???? // printf("%s, %p, %p\n", p, p, s7); // p=strtok(NULL, "_"); //怎么知道是对哪个操作的???? // printf("%s, %p, %p\n", p, p, s7); while(p){ printf("%s, %p, %p\n", p, p, s7); p=strtok(NULL, "_"); } return 0; }
相关文章推荐
- 记第一个15年
- hdu2437
- Building an MFC project for a non-Unicode character set is deprecated
- 中序后序确定二叉树的前序序列
- GPUImage使用
- ArrayAdapter
- Linux 上的基础网络设备详解
- cocos 项目棋魂
- ACM_算法_二叉树遍历方法的互相转换 (TOJ 3988 Password)
- python多进程队列的2种实现方法
- linux arm移植触摸屏tslib
- Adb connection Error:远程主机强迫关闭了一个现有的连接。
- Orleans初战(用分布式解决高并发购物场景)
- NOIP2015 子串
- unity,standalone下自定义分辨率不起作用的解法
- Roman to Integer
- zabbix监控web
- 博弈论与逻辑思维(传教士与妻子忠贞的问题)
- 网络框架构建
- 科幻电影中的科技