C語言-字符串典型問題分析
阿新 • • 發佈:2018-12-17
++ 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" 78 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語言-字符串典型問題分析