C语言笔记 第三十一课 字符串典型问题分析(都是面试题)---基础很重要

第三十一课 字符串典型问题分析(都是面试题)—基础很重要

典型问题一

下面的程序输出什么?为什么?
char buf[10] = {0};
char src[] = “hello %s”;
snprintf(buf, sizeof(buf), src);
printf(“buf = %s\n”, buf);
有警告,能编译,有可执行结果
输出:buf = hello ??
分析:
snprintf函数本身是可变参数函数,原型如下:
int snprintf(char* buffer,int buf_size,const char* fomart,…)
当函数只有3个参数时,如果第三个参数没有包含格式化信息,函数调用没有问题;相反,如果第三个参数包含了格式化信息,但缺少后续对应参数,则程序行为不确定。
改法一:
char buf[10] = {0};
char src[] = “hello DT”; //%s属于格式化信息
snprintf(buf, sizeof(buf), src);
printf(“buf = %s\n”, buf);
输出结果为buf = hello DT
改法二:
char buf[10] = {0};
char src[] = “hello %s”;
snprintf(buf, sizeof(buf), src,”D,T.”);//加第四个参数,且必须是字符串
printf(“buf = %s\n”, buf);
输出结果为buf = hello D.T.

典型问题二

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

#define STR "Hello, \0D.T.Software\0"
    char* src = STR;
    char buf[255] = {0};
snprintf(buf, sizeof(buf), src);

    printf("strlen(STR) = %d\n", strlen(STR)); //7  Hello,  6+1 字符串
printf("sizeof(STR) = %d\n", sizeof(STR)); //22  Hello, \0D.T.Software\0 21+1 字符串字面量

    printf("strlen(src) = %d\n", strlen(src)); //7 Hello,  6+1 指针指向字符串长度
    printf("sizeof(src) = %d\n", sizeof(src)); //4  src是个指针,指针长度为4

    printf("strlen(buf) = %d\n", strlen(buf)); //7 Hello,  6+1 字符串
    printf("sizeof(buf) = %d\n", sizeof(buf)); //255   buf[255]  buf数组在内存所占用的空间

    printf("src = %s\n", src);  //hello,
printf("buf = %s\n", buf); //hello,
输出结果:有警告
strlen(STR) = 7
sizeof(STR) = 22
strlen(src) = 7
sizeof(src) = 8
strlen(buf) = 7
sizeof(buf) = 255
src = Hello, 
buf = Hello, 

分析:
字符串相关的函数均以第一个出现的’\0’作为结束符
编译器总是会在字符串字面量的末尾添加’\0’
字符串字面量的本质为数组
三个概念不同,却有联系
字符串:是一个特殊的字符数组
字符指针:可以指向一个字符数组
字符数组:可以指向一个字符串

典型问题三

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

#define S1 "D.T.Software"
    #define S2 "D.T.Software"
    if( S1 == S2 )  //字符串地址的比较
    {
        printf("Equal\n");
    }
    else
    {
        printf("Non Equal\n");
    }
    if( strcmp(S1, S2) == 0 ) // strcmp比较两个字符串内容是否相同
    {
        printf("Equal\n");
    }
    else
    {
        printf("Non Equal\n");
    }
输出结果:gcc编译器的优化才使第一个输出equal,优化是将同一个字符串字面量映射到一个无名数组
Equal
Equal

分析:
字符串之间的相等比较需要用strcmp完成
不可直接用进行字符串直接的比较
完全相同的字符串字面量的
比较结果为false
一些现代编译器能够将相同的字符串字面量映射到同一个无名字符数组,因此==比较的结果为true。故不编写依赖特殊编译器的代码!!!

典型问题四

下面的程序输出什么?为什么?
字符串循环右移
void right_shift_r(const char* src, char* result, unsigned int n)
返回为空 右移字符串 右移结果 右移位数
函数功能:将输入字符串src循环右移n位,result为输出结果。
要求:以效率最高的方式实现。
示例: “abcde” --2–> “deabc”
            “abcde” --8–> “cdeab”
在这里插入图片描述
输出结果:
deabc
abcde
cdeab

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值