典型问题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\n", 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, \0D.T.Software\0"
 7     
 8     char* src = STR;
 9     char buf[255] = {0};
10     
11     snprintf(buf, sizeof(buf), src);
12     
13     printf("strlen(STR) = %d\n", strlen(STR));
14     printf("sizeof(STR) = %d\n", sizeof(STR));
15     
16     printf("strlen(src) = %d\n", strlen(src));
17     printf("sizeof(src) = %d\n", sizeof(src));
18     
19     printf("strlen(buf) = %d\n", strlen(buf));
20     printf("sizeof(buf) = %d\n", sizeof(buf));
21     
22     printf("src = %s\n", src);
23     printf("buf = %s\n", buf);
24     
25     return 0;
26 }

第6行的字符串在编译器处理后会包含3个'\0'。sizeof作用域一个字符串,会返回所有的字符总数 ,包括编译器添加上的'\0'。

运行结果如下:

 

输出符合预期。

 

字符串、字符数组、字符指针本质是不同的,但是它们之间有一定的关系。

字符串是一个特殊的字符数组,字符指针可以指向一个字符数组。因此,可以说字符指针可以指向一个字符串。

 

典型问题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\n");
12     }
13     else
14     {
15         printf("Non Equal\n");
16     }
17     
18     if( strcmp(S1, S2) == 0 )
19     {
20         printf("Equal\n");
21     }
22     else
23     {
24         printf("Non Equal\n");
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] = '\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;
}

只遍历了一次字符串,就将结果计算出来了,因此,效率是最高的。复杂度是O(n),是最优的了。

运行结果如下:

 

完全符合预期。

 

posted on 2018-08-26 23:32  周伯通789  阅读(163)  评论(0编辑  收藏  举报