• 第31课 字符串典型问题分析


    典型问题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] = '';
    }
    
    int main()
    {
        char result[255] = {0};
        
        right_shift_r("abcde", result, 2);
        
        printf("%s
    ", result);
        
        right_shift_r("abcde", result, 5);
        
        printf("%s
    ", result);
        
        right_shift_r("abcde", result, 8);
        
        printf("%s
    ", result);
        
        return 0;
    }

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

    运行结果如下:

    完全符合预期。

  • 相关阅读:
    svn客户端使用
    svn服务端搭建
    数组和链表
    旅行商算法
    大O表示法
    交互页面的一些设计规则
    正则表达式大全
    初识算法—二分法初探
    log4j配置
    品优购商城项目(二)mybatis分页插件
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9539538.html
Copyright © 2020-2023  润新知