例程 1
#include <stdio.h>
int main()
{
char buf[10] = {0};
char src[] = "hello %s";
/*
snprintf(),函数原型为int snprintf(char *str, size_t size, const char *format, ...)
将可变参数 “…” 按照format的格式格式化为字符串,然后再将其拷贝至str中。
*/
snprintf(buf,sizeof(buf),src);
printf("buf = %s\n",buf);
return 0;
}
执行结果:
例程1分析:
snprintf只有3个参数时,如果第3个参数没有包含格式化信息,函数调用没问题;相反如果第3个参数有格式化信息,但缺少后续对应参数,则程序行为不确定。
例程 2
#include <stdio.h>
#include <string.h>
int main()
{
#define STR "hello, \0 C is beaultiful\0"//这里面一共25个字符
char* src = STR;
char buf[255] = {0};
snprintf(buf,sizeof(buf),src);
printf("strlen(STR) = %d\n",strlen(STR));
printf("sizeof(STR) = %d\n",sizeof(STR));
printf("strlen(src) = %d\n",strlen(src));
printf("sizeof(src) = %d\n",sizeof(src));
printf("strlen(buf) = %d\n",strlen(buf));
printf("sizeof(buf) = %d\n",sizeof(buf));
printf("sizeof(char*) = %d\n",sizeof(char*));
printf("src = %s\n",src);
printf("buf = %s\n",buf);
return 0;
}
执行结果:
例程2分析:
所有字符串操作函数都是以字符串中第一个'\0'做为停止的标志,所以第1、3 、5条打印的是7
第2条打印26是因为宏定义的字符串被编译器视为字符串常量,并且会自动在末尾加上'\0'
第4条打印8是因为src为char*类型,是指针类型,指针的长度与编译器和机器字长都有关系,我本机是MinGW64位的gcc编译器 机器字长64位 所以打印出来的长度为8 这个在后续的 sizeof(char*)有验证
第6条打印255是因为buf的类型是char[255] 所以占用的长度为1*255 等于255
最后2条则是验证了字符串拷贝函数是以第一个'\0'做为停止标志
例程 3
#include <stdio.h>
#include <string.h>
int main()
{
#define S1 "hello"
#define S2 "hello"
if (S1 == S2)
{
printf("equal\n");
}
else
{
printf("no equal\n");
}
if (strcmp(S1,S2) == 0)
{
printf("equal\n");
}
else
{
printf("no equal\n");
}
return 0;
}
GCC编译器执行结果:
例程3分析:
这说明GCC编译器会对宏定义做优化,而对于有些编译器,不会做优化,则第一条比较输入的结果位”no equal“
例程 4
#include <stdio.h>
#include <string.h>
void right_shift_nbit(const char* src,char* result,unsigned int n)
{
const unsigned int LEN = strlen(src);
int i = 0;
for (i = 0; i < LEN; i++)
{
result[(i+n) % LEN] = src[i];
}
result[LEN] = '\0';
}
int main()
{
//字符串循环右移
//例如:“abcde” 循环右移动2位得到 “deabc”
//要求以最高效的方式实现
char result[20] = {0};
right_shift_nbit("abcde",result,2);
printf("%s\r\n",result);
memset(result,0,sizeof(result));
right_shift_nbit("abcde",result,5);
printf("%s\r\n",result);
memset(result,0,sizeof(result));
right_shift_nbit("abcde",result,8);
printf("%s\r\n",result);
return 0;
}
执行结果:
例程4分析
当一个字符串长5个字节时,我们循环右移5位,这时相当于没有右移;当我们移动2位时,第0位变为第2位,第5位变为第1位;于是可以发现一个规律,移动后的脚标 = (移动前的脚标+移动位数)% 字符串长度