您的位置:首页 > 其它

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的意思。

注意:上面说的溢出,都是目标字符数组的长度 无法容纳最终的结果导致的。

代码如下:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: