典型问题1:
下面的程序输出什么?为什么?
snprintf将src的信息打印到buf中。
示例如下:
1 #include <stdio.h> 2 3 int main() 4 { 5 char buf[10] = {0}; 6 char src[] = "hello %s"; 7 8 snprintf(buf, sizeof(buf), src); 9 10 printf("buf = %s ", buf); 11 12 return 0; 13 }
运行结果如下:
输出不符合我们的预期,我们预期输出hello %s。
分析如下:
snprintf需要几个变参是由format决定的。
典型问题2:
示例程序如下:
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 #define STR "Hello, D.T.Software " 7 8 char* src = STR; 9 char buf[255] = {0}; 10 11 snprintf(buf, sizeof(buf), src); 12 13 printf("strlen(STR) = %d ", strlen(STR)); 14 printf("sizeof(STR) = %d ", sizeof(STR)); 15 16 printf("strlen(src) = %d ", strlen(src)); 17 printf("sizeof(src) = %d ", sizeof(src)); 18 19 printf("strlen(buf) = %d ", strlen(buf)); 20 printf("sizeof(buf) = %d ", sizeof(buf)); 21 22 printf("src = %s ", src); 23 printf("buf = %s ", buf); 24 25 return 0; 26 }
第6行的字符串在编译器处理后会包含3个' '。sizeof作用域一个字符串,会返回所有的字符总数 ,包括编译器添加上的' '。
运行结果如下:
输出符合预期。
字符串、字符数组、字符指针本质是不同的,但是它们之间有一定的关系。
字符串是一个特殊的字符数组,字符指针可以指向一个字符数组。因此,可以说字符指针可以指向一个字符串。
典型问题3:
S1==S2本质上是想将两个字符数组做比较,字符串字面量的本质就是字符数组,S1和S2在值上是相等的两个字符数组,但它们在地址中可能占用两片不同的区域,因此,S1、S2(代表字符数组的首地址)可能不相等。
程序如下:
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 #define S1 "D.T.Software" 7 #define S2 "D.T.Software" 8 9 if( S1 == S2 ) 10 { 11 printf("Equal "); 12 } 13 else 14 { 15 printf("Non Equal "); 16 } 17 18 if( strcmp(S1, S2) == 0 ) 19 { 20 printf("Equal "); 21 } 22 else 23 { 24 printf("Non Equal "); 25 } 26 27 return 0; 28 }
运行结果如下:
第一个输出与我们的分析有出入,这是为什么呢?
这是编译器的优化,S1和S2代表了同一片内存。编译器先定义S1代表的字符串,然后开始定义S2,当编译器发现S2代表的字符串已经定义了,于是直接让S2代表了S1这片内存。
bcc32的编译输出结果如下:
bcc32中的S1和S2代表的不是同一片内存。
分析:
在工程中不要编写依赖特殊编译器的代码。
典型问题4:
示意图如下:
关键点在于计算出循环右移后字符的下标变化规律。求出变化公式。
程序如下:
#include <stdio.h> #include <string.h> 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] = '