字符串典型问题分析-创新互联

典型问题一:

成都创新互联公司是由多位在大型网络公司、广告设计公司的优秀设计人员和策划人员组成的一个具有丰富经验的团队,其中包括网站策划、网页美工、网站程序员、网页设计师、平面广告设计师、网络营销人员及形象策划。承接:成都做网站、网站设计、网站改版、网页设计制作、网站建设与维护、网络推广、数据库开发,以高性价比制作企业网站、行业门户平台等全方位的服务。

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

#include
int main()
{

    char buf[10] = {0};
    char src[] = "hello %s";
    snprintf(buf, sizeof(buf), src);
    printf("buf=%s\n", buf);
    return 0;
}

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

字符串典型问题分析


分析:

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

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

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

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


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


#include
int main()
{

    char buf[10] = {0};
    char src[] = "hello word";
    snprintf(buf, sizeof(buf), src);
    printf("buf=%s\n", buf);
    return 0;
}

运行结果如图:

字符串典型问题分析

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

#include
int main()
{

    char buf[11] = {0};
    char src[] = "hello %s";
    snprintf(buf, sizeof(buf), src,"world");
    printf("buf=%s\n", buf);
    return 0;
}

字符串典型问题分析

典型问题二:

#define STR "hello,\0D.T.Software\0"
#include
int main()
{

    char* src = STR;
    char buf[255] = { 0 };
    printf(buf, sizeof(buf), src);
    printf("strlen(STR)=%d\n", strlen(STR));  //7
    printf("sizeof(STR)=%d\n", sizeof(STR)); //22
    printf("strlen(src)=%d\n",strlen(src));  //7
    printf("sizeof(src)=%d\n",sizeof(src));   //4
    printf("strlen(buf)=%d\n",strlen(buf));  //7
        printf("sizeof(buf)=%d\n",sizeof(buf));  //255
    printf("src=%s\n", src);               //hello.        
    printf("buf=%s\n", buf);               //hello.
    return 0;
}

分析: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的内容。所以是相等的。

分析:

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


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

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

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



典型问题四:

 字符串循环右移

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

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


字符串典型问题分析


分析:

字符串典型问题分析

#include
#include

void right_shift_r(const char* src, char* result, unsigned int n)
{
    int len = strlen(src);
    int i = 0;
    for (i = 0; i < len; i++)
    {
        result[(n + i) % len] = src[i];
    }
    result[len] = '\0';
}


int main()
{

    char result[255] = { 0 };
    right_shift_r("abcde", result, 2);
    printf("%s\n", result);
    system("pause");
}

字符串典型问题分析

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


名称栏目:字符串典型问题分析-创新互联
转载源于:http://ybzwz.com/article/gocdj.html