就传代码吧。。。
#include <iostream> #include <string.h> #include <stdlib.h> void differFromStrlenAndSizeof(void); void stringContact(void); void stringCompare(void); void stringCopy(void); void formatString(void); void findSpicified(void); void splitString(void); void turnInto(void); int main(int argc, char** argv) { //differFromStrlenAndSizeof(); //stringContact(); //stringCompare(); //stringCopy(); //formatString(); //splitString(); turnInto(); return 0; } void turnInto(void){ //包含在 stdlib 里面 int a = atoi("23"); printf("%d\n",a); float b = atof("23.4"); printf("%f\n",b); long c =atol("123456789"); printf("%d\n",c); } //字符串儿分割 void splitString(void){ char buf[] ="[email protected]@ghi"; char *p = strtok(buf,"@"); while(p){ printf("%s\n",p); p =strtok(NULL,"@"); } } /** 查找指定元素 */ void findSpicified(void){ char s[10]="abcdefg"; printf("%d\n",strchr(s,‘d‘));//下标的值 返回3 printf("%d\n",*strchr(s,‘d‘)); printf("%c\n",*strchr(s,‘d‘)); printf("%d\n",strchr(s,‘p‘)); printf("%d\n",strstr(s,"de")); printf("%d\n",strstr(s,"df")); //不太好(hui)用 } /** 格式化字符串儿 */ void formatString(void){ //同printf() 基本一样,只不过 sprintf()这个 函数只是单纯像一个char[] 数组 输出 一个 字符串儿 char buf[10]; sprintf(buf,"asdf");//存在溢出问题 sprintf(buf,"%d",3);//并且还会覆盖 printf(buf); } /** 字符串复制 */ void stringCopy(void){ char s1[] = "123"; char s2[10]; strcpy(s2,s1); printf(s2); //试一下超长复制 char slong[100] ="ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"; //如果不出错,那就是因为还不够长,但是只要是这样,就是隐患,隐患如果现在不出异常,就迟早会出 //所以一般看C写得怎么样,就把这个程序连续开一周,每天多少次多少次的执行,看会不会死机。 //如果没事儿,那就基本没事儿。如果有事儿,就得看看这些地方了。 //对于工业界来说,有些程序跑了一年多都没问题,可是时间再长一点儿,可能就不行了。是会存在这样的状况的。 //strcpy(s2,slong); //printf(s2); //所以为了避免这个事儿,一样准备了,strncpy() 字符串儿拷贝命令,需要传递三个参数,复制长度。 //这个就不试了,但是一样要求。是sizeof(s2)-strlen(s2)-1;【但是我总觉得最好再在结尾复制一个\0比较好】 strncpy(s2,slong,sizeof(s2)-strlen(s2)-1); printf(s2); } /** 字符串的全比较strcmp 字符串的有限位比较strncmp 多加一个参数 返回的是挨个字符相减的结果,前面-后面 a-b<0 所以返回-1 ,用对应的ASCII 码进行比对。 */ void stringCompare(void){ char s1[]="a"; char s2[]="b"; printf("%d\n",strcmp(s1,s2));//-1 char s3[] ="c"; printf("%d\n",strcmp(s3,s2));//1 printf("%d\n",strcmp(s1,s1));//0 printf("%d\n",sizeof(s3));//2 char ss1[]="lifei1"; char ss2[]="lifeaa"; printf("%d\n",strncmp(ss1,ss2,4));//0 printf("%d\n",strncmp(ss1,ss2,5));//1 } /** 发现sizeof返回的值带着\0,所以是6个数儿。而strlen是5个数儿。 并且sizeof 反馈的是这个东西所开辟的内存空间的大小,而strlen只返回纯字符的部分。 */ void differFromStrlenAndSizeof(void){ char s[]="lifei"; printf("sizeof(s)是:%d\nstrlen(s)是:%d\n",sizeof(s),strlen(s)); char s10[10]= "comeon"; printf("sizeof(s10)是:%d\nstrlen(s10)是:%d",sizeof(s10),strlen(s10)); } /** 字符追加操作 */ void stringContact(void){ char sa[10] = "123"; char sb[20] = "abc"; strcat(sa,sb); printf(sa); printf("\n"); char sc[]="123456789ddddddddddddddddddddddddddddddddddddddddddddddddd"; //strcat(sa,sc);这里会出异常啦~ //printf(sa); //strncat(sa,sc,sizeof(sa)-strlen(sa));为sa分配的空间-sa中内容所占的空间。 //这里好像是没有错误,但是其实,有因为 没有\0这样字符串就没有结束,所以本质上是错误语句但是并不会带来错误。 //strncat(sa,sc,11);直接报错,原因是:此时拼接完成后,sa的长度为17我的操作系统是8位的。 //所以在输出地址的时候总是16个0,每一个都是16进制的。所以我想先把这个数加出去,然后瞬间就报了强制停止 //strncat(sa,sc,10);这里一直在输出吓得我摁了ctrl+c把程序停了下来 //strncat(sa,sc,9);然后貌似是正常运行了 //并且这个 结果极不稳定。有一定几率出错误。在我写了一些注释之后,这个结果就试不出来了,但是可以接着把这个数往上面加, //直到他又挤占了某一个别人要用的内存地址的时候异常就会再次出现,比如这次再加一个16位 //好吧我其实是想说,应该给它留一个字符的结束位置。 //sizeof(sa)-strlen(sa)-1,那一个1是留给\0的。 strncat(sa,sc,sizeof(sa)-strlen(sa)); printf(sa); sizeof(sa); printf("\n%d",sizeof(sa)); //总感觉这里面有问题,因为 sizeof(sa)-strlen(sa)=4.可是,事实上刚刚我们放了123456789在sa里面也没有出问题。 //所以 本不该放那么多数据,如果加一个限制的话。我想想到哪里不会出问题 //并没有想通,这个数字是试出来的。 }
时间: 2024-10-03 23:16:42