第三十一课 字符串典型问题分析(都是面试题)—基础很重要
典型问题一
下面的程序输出什么?为什么?
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