C语言实例问题探究字符串函数的应用
目录
一、典型问题一二、典型问题二三、典型问题三四、典型问题四一、典型问题一
下面的程序输出什么?为什么?
分析
snprintf 函数本身是可变参数函数,原型如下:int snprintf( char* buffer, int buf_size, const char*fomart,... )
当函数只有 3 个参数时,如果第三个参数没有包含格式化信息,函数调用没有问题:相反,如果第三个参数包含了格式化信息,但缺少后续对应参数,则程序行为不确定。
下面编程看看究竟会输出什么:
#includeint main() { char buf[10] = {0}; char src[] = "hello %s"; snprintf(buf, sizeof(buf), src); printf("buf = %s\n", buf); return 0; }
输出结果如下:
所以程序该这么写:
#includeint main() { char buf[10] = {0}; char src[] = "hello %s"; snprintf(buf, sizeof(buf), src, "Ze"); printf("buf = %s\n", buf); return 0; }
或者这样:
#includeint main() { char buf[10] = {0}; char src[] = "hello Ze"; snprintf(buf, sizeof(buf), src); printf("buf = %s\n", buf); return 0; }
均能输出正确的结果:
二、典型问题二
下面的程序输出什么?为什么?
分析
字符串相关的函数均以第一个出现的 "\0" 作为结束符编译器总是会在字符串字面量的末尾添加 "\0"字符串字面量的本质为数组下面来编程验证:
#include#include int main() { #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)); 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("src = %s\n", src); printf("buf = %s\n", buf); return 0; }
输出结果如下:
注意 sizeof(src) = 4,这是因为 src 为指针
三、典型问题三
下面的程序输出什么?为什么?
分析
字符串之间的相等比较需要用 strcmp 完成不可直接用 == 进行字符串直接的比较完全相同的字符串字面量的 == 比较结果为 false一些现代编译器能够将相同的字符串字面量映射到同一个无名字符数组,因此 == 比较结果为 true 。
下面来编程验证:
#include#include int main() { #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 ) { printf("Equal\n"); } else { printf("Non Equal\n"); } return 0; }
在 gcc 编译器中输出结果如下:
在 VS2012 编译器的输出结果也是:
四、典型问题四
字符串循环右移
void right_shift_r(const char* src, char* result, unsigned int n);
函数功能:将输入字符串 src 循环右移 n 位,result 为输出结果
要求:以效率最高的方式实现。
示例:
"abcde" -- 2 --> "deabc"
"abcde" -- 8 --> "cdeab"
来看一个示意图:
代码如下:
#include#include void right_shift_r(const char* src, char* result, unsigned int n) { const unsigned 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); right_shift_r("abcde", result, 5); printf("%s\n", result); right_shift_r("abcde", result, 8); printf("%s\n", result); return 0; }
输出结果如下:
到此这篇关于C语言实例问题探究字符串的应用的文章就介绍到这了,更多相关C语言 字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?