温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

字符串典型问题分析

发布时间:2020-07-18 08:58:47 来源:网络 阅读:181 作者:peter2017 栏目:编程语言

典型问题一:

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


#include<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
#include<string.h>

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

字符串典型问题分析


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI