网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

字符串典型问题分析

典型问题一:

成都创新互联主要从事网站建设、网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务泽州,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792

   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");
}

字符串典型问题分析


新闻标题:字符串典型问题分析
文章分享:http://bjjierui.cn/article/iipgpd.html

其他资讯