字符串在攻击语言(如C#/Java)中的操作是相当的简单的,但是无奈C是爷爷辈的,对字符串操作都是比较困难的(实际上高级语言也是封装了一些操作)。所以有必要写一篇关于C的字符串相关的总结。
首先上代码:
#include <stdio.h> #include <stdlib.h> int main() { system("color 1A"); char names1[] = {‘A‘,‘o‘,‘n‘,‘a‘,‘u‘,‘f‘,‘l‘,‘y‘,‘\0‘}; char names2[] = "Aonaufly"; printf("names1 的值为 : %s\n" , names1); printf("names2 的值为 : %s\n" , names2); return 0; }
执行的结果为:
从执行的想过来看
char names1[] = {‘A‘,‘o‘,‘n‘,‘a‘,‘u‘,‘f‘,‘l‘,‘y‘,‘\0‘}; / char names2[] = "Aonaufly";
申明字符串的效果是一样的。也可以得出结论:
①,字符串和字符数组的区别是后面是否有\0。
②,字符串的最后一个字符永远是\0,占一个字节。注意(中文占2个字节,英文占一个字节)。
如下:
#include <stdio.h> #include <stdlib.h> int main() { system("color 1A"); char names1[] = {‘A‘,‘o‘,‘n‘,‘a‘,‘u‘,‘f‘,‘l‘,‘y‘,‘\0‘}; char names2[] = "Aonaufly"; printf("names1 的值为 : %s\n" , names1); printf("names2 的值为 : %s\n" , names2); printf("names1 的长度 : %d\n" , sizeof(names1)/sizeof(char)); printf("names2 的长度 : %d\n" , sizeof(names2)/sizeof(char)); return 0; }
执行结果:
\0在C的字符串中只是一个不得不用的占位符。
我再次拓展下中文情况 , 代码如下:
#include <stdio.h> #include <stdlib.h> int main() { system("color 1A"); char names1[] = {‘A‘,‘o‘,‘n‘,‘a‘,‘u‘,‘f‘,‘l‘,‘y‘,‘\0‘}; char names2[] = "Aonaufly"; printf("names1 的值为 : %s\n" , names1); printf("names2 的值为 : %s\n" , names2); printf("names1 的长度 : %d\n" , sizeof(names1)/sizeof(char)); printf("names2 的长度 : %d\n" , sizeof(names2)/sizeof(char)); printf("************************************************************\n"); char chinese[] = "我是谁?"; printf("chinese 的值为 : %s\n" , chinese); printf("chinese 的长度 : %d\n" , sizeof(chinese)/sizeof(char)); return 0; }
中文占2个字节(包括中文字符?);那么chinese在内存中占的长度为 : 2*4 + 1(\0占一个字节) = 9 , 其打印的结果如下:
C中关于string的内置函数一般在string.h当中
1,strchr : 原型str(char *,char) ->在char[]当中,得到一个指向字符串中char(第一个)的指针。如在“Aonaufly”中找到‘o’的指针 ,如果没找到返回NULL。代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { system("color 1A"); char names1[] = {‘A‘,‘o‘,‘o‘,‘a‘,‘u‘,‘f‘,‘l‘,‘y‘,‘\0‘}; char * prt_cahr = strchr(names1 , ‘o‘); if(prt_cahr != NULL) { *prt_cahr = ‘s‘; } printf("names1 的值为 : %s\n" , names1); return 0; }
运行如下:
2,strlen : 字符长度(重点 : 不计\0 , 一个中文占2个字节)。代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { system("color 1A"); char names1[] = {‘A‘,‘o‘,‘o‘,‘a‘,‘u‘,‘f‘,‘l‘,‘y‘,‘\0‘}; char * prt_cahr = strchr(names1 , ‘o‘); if(prt_cahr != NULL) { *prt_cahr = ‘s‘; } printf("names1 的值为 : %s\n" , names1); printf("**********************************************************\n"); char names2[] = "s我"; printf("names2 的长度为 : %d\n" , strlen(names2)); return 0; }
一个‘s’(英文) + 一个‘我’中文长度为3 , 结果如下:
3,strcpy原型:strcpy(a,b)->将b复制到a(注意:a的空间要比b的大 , 否则b的内容至于一部分复制到a中)
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { system("color 1A"); char names1[] = {‘A‘,‘o‘,‘n‘,‘a‘,‘u‘,‘f‘,‘l‘,‘y‘,‘\0‘}; char names2[] = "sk"; strcpy(names1,names2); printf("names1 value : %s\n" , names1); for(int i = 0 , j = sizeof(names1)/sizeof(char) ; i < j ; i ++) { printf("%c\n",*(names1+i)); } return 0; }
运行结果如下:
4,strcmp 字符串比较 strcmp( a , b ) a>b返回正数 ; a == b 返回 0 ; a < b 返回负数。注:按ASCII进行比较
5,strcat 字符串链接 strcat( a , b) 将b复制到a的后面 , a的长度一定要大
6,gets 可以或造成越界 (如定义了长度为20 , 结果输入为21 ) gets(char *) 。代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { system("color 1A"); char names1[2]; gets(names1); printf("names1 值 : %s\n" , names1); printf("names1 长度 : %d\n" , strlen(names1)); for( int i = 0 , j = strlen(names1) ; i < j ; i++) { printf("names1 第%d个值为%c\n" , i + 1 , *(names1+i)); } return 0; }
运行结果如下:
7,puts 专门打印字符串 puts(char *) .它会自动在后面加一个\n
8 , fgets fgets(char * , len , stdin) 最多接收len-1个字符 。遗憾的是已\n结束,而不是以\0结束 。 比gets要安全。
本文出自 “Better_Power_Wisdom” 博客,请务必保留此出处http://aonaufly.blog.51cto.com/3554853/1916458
原文:http://aonaufly.blog.51cto.com/3554853/1916458