1. 程式人生 > >C語言-字符串典型問題分析

C語言-字符串典型問題分析

++ hello mar lse inf sso size eof shift

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

分析:

字符串相關的函數均以第—個出現的 ‘\0‘作為結束符

編譯器總是會在字符串字面量的未尾添加‘\0‘

字符串字面量的本質為數組

技術分享圖片

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\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 } 

分析:

字符串之間的相等比較需要用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] = \0;  
15 }  
16   
17 int main()  
18 {  
19     char result[255] = {0};  
20       
21     right_shift_r("abcde", result, 2);  
22       
23     printf("%s\n", result);  
24       
25     right_shift_r("abcde", result, 5);  
26       
27     printf("%s\n", result);  
28       
29     right_shift_r("abcde", result, 8);  
30       
31     printf("%s\n", result);  
32       
33     return 0;  
34 }  

C語言-字符串典型問題分析