典型问题一:

1.下面的程序输出什么为什么?


#include<stdio.h>intmain(){charbuf[10]={0};charsrc[]="hello%s";snprintf(buf,sizeof(buf),src);printf("buf=%s\n",buf);return0;}

在linux下运行得到的结果如图:


分析:

首先要搞懂snprint()函数的功能。

int snprintf(char* buffer,int buf_size,const char* fomart,........)

当函数只有3个参数时,如果第三个参数没有包含格式化信息,函数调用没有问题;相反,如果第三个参数包含了格式化信息,但缺少后续对应参数,则程序运行结果不确定。

注意:格式化信息必须与变参个数相匹配。

在这个例子中,第三个参数src包含了格式化信息%s,但是我们没有提供%s所需要的字符串,所以程序运行的结果如图所示。

#include<stdio.h>intmain(){charbuf[10]={0};charsrc[]="helloword";snprintf(buf,sizeof(buf),src);printf("buf=%s\n",buf);return0;}

运行结果如图:

如果src里面包含格式化信息,则在snprintf()函数里面要添加第四个参数,且这个参数必须是字符串。

#include<stdio.h>intmain(){charbuf[11]={0};charsrc[]="hello%s";snprintf(buf,sizeof(buf),src,"world");printf("buf=%s\n",buf);return0;}

典型问题二:

#defineSTR"hello,\0D.T.Software\0"#include<stdio.h>intmain(){char*src=STR;charbuf[255]={0};printf(buf,sizeof(buf),src);printf("strlen(STR)=%d\n",strlen(STR));//7printf("sizeof(STR)=%d\n",sizeof(STR));//22printf("strlen(src)=%d\n",strlen(src));//7printf("sizeof(src)=%d\n",sizeof(src));//4printf("strlen(buf)=%d\n",strlen(buf));//7printf("sizeof(buf)=%d\n",sizeof(buf));//255printf("src=%s\n",src);//hello.printf("buf=%s\n",buf);//hello.return0;}

分析:1.字符串相关的函数均以第一个出现的'\0'作为结束符。

2.编译器总是会在字符串字面量的末尾添加'\0'。

3.字符串字面量的本质为数组。


字符串 字符数组 字符指针 三者的本质是不同的,但是他们相互之间又有联系,字符串是一个特殊的字符数组,字符指针可以指向一个字符数组。因此,字符指针可以指向字符串。


典型问题三:



运行结果:

在程序运行的过程中GCC编译器看到“D.T.Soft"已经被S1定义到了只读存储区,当发现"D.T.Soft”又被S2定义的时候 这个时候GCC编译器会进行优化,将S1.S2映射到同一块内存空间上面去。所以s1==s2是相等的。这样避免了内存的浪费。

同样,若是用strcmp(s1,s2)==0 ;这个时候返回的结果是True;因为strcmp()主要是比较s1.s2的内容。所以是相等的。


分析:

字符串之间的相等比较需要用strcmp完成

不可直接用==进行字符串直接的比较

完全相同的字符串字面量的==比较结果为false



注意:一些现代编译器能够将相同的字符串字面量映射到同一个无名字符数组,因此==比较结果为true;



典型问题四:

字符串循环右移

void right_shift_r(const char* src,char* result,unsigned int n);

函数功能:将输入字符串src循环右移n位,result为输出结果。



分析:

#include<stdio.h>#include<string.h>voidright_shift_r(constchar*src,char*result,unsignedintn){intlen=strlen(src);inti=0;for(i=0;i<len;i++){result[(n+i)%len]=src[i];}result[len]='\0';}intmain(){charresult[255]={0};right_shift_r("abcde",result,2);printf("%s\n",result);system("pause");}