zoukankan      html  css  js  c++  java
  • C语言-字符串典型问题分析

    1、典型问题一

    下面的程序输出什么为什么?

     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);   //src打印到buf里面 9     printf("buf = %s
    ", buf);  10     return 0;  
    11 }  

    分析 :

      snprintf函数本身是可变参数函数,原型如下: 

       int snprintf(char* buffer, int buf_size, const char* fomart, ...) 

      当函数只有3个参数时,如果第三个参数没有包含格式化信息,函数调用没有问题;相反,如果第三个参数包含了格式化信息,但缺少后续对应参数,则程序行为不确定。

                              

    应改为

    1     snprintf(buf, sizeof(buf), src, "wss");  

    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));  //7
    14     printf("sizeof(STR) = %d
    "sizeof(STR));  //22,即便是结尾也会编译器也会再加上
    15       
    16     printf("strlen(src) = %d
    ", strlen(src));  //7
    17     printf("sizeof(src) = %d
    "sizeof(src));  //4
    18       
    19     printf("strlen(buf) = %d
    ", strlen(buf));  //7
    20     printf("sizeof(buf) = %d
    "sizeof(buf));  //255
    21       
    22     printf("src = %s
    ", src);  //Hello
    23     printf("buf = %s
    ", buf);  //Hello
    24       
    25     return 0;  
    26 }  

    分析:

                    字符串相关的函数均以第—个出现的 ''作为结束符 

                    编译器总是会在字符串字面量的未尾添加'' 

                    字符串字面量的本质为数组

    3、典型问题三 

    下面的程序输出什么为什么?       

     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

    分析:

                       字符串之间的相等比较需要用strcmp完成 

                       不可直接用==进行字符串直接的比较 

                       完全相同的字符串字面量的==比较结果为false 

                       一些现代编译器能够将相同的字符串字面量 

                       映射到同—个无名字符数组,因此==比较 

                       结果为true。

    4、典型问题四 

    字符串循环右移

     1 #include <stdio.h>  
     2 #include <string.h>  
     3   
     4 void right_shift_r(const char* src, char* result, unsigned int n)  
     5 {  
     6     const unsigned int LEN = strlen(src);  
     7     int i = 0;  
     8           
     9     for(i=0; i < LEN; i++)  //O(n)
    10     {  
    11         result[(n + i) % LEN] = src[i];  
    12     }  
    13       
    14     result[LEN] = '';  
    15 }  
    16   
    17 int main()  
    18 {  
    19     char result[255] = {0};  
    20       
    21     right_shift_r("abcde", result, 2);  
    22       
    23     printf("%s
    ", result);  
    24       
    25     right_shift_r("abcde", result, 5);  
    26       
    27     printf("%s
    ", result);  
    28       
    29     right_shift_r("abcde", result, 8);  
    30       
    31     printf("%s
    ", result);  
    32       
    33     return 0;  
    34 }  
  • 相关阅读:
    伪元素改变placeholder占位符属性的默认样式实例页面
    盒子中margin重叠问题
    html或CSS的图片如何随着网页界面的缩小或放大跟着左右移动 ?
    相对路径与绝对路径
    Html5 Canvas小知识
    dl,dt,dd怎么用
    雪碧图
    linux--mysql图形工具 tora
    apt-get彻底卸载删除软件http://www.tennfy.com/1518.html
    【转】 httpclient 模拟浏览器动作需注意的cookie和HTTP头等信息
  • 原文地址:https://www.cnblogs.com/lemaden/p/10128090.html
Copyright © 2011-2022 走看看