您好,登錄后才能下訂單哦!
典型問題一:
1.下面的程序輸出什么為什么?
#include<stdio.h> int main() { char buf[10] = {0}; char src[] = "hello %s"; snprintf(buf, sizeof(buf), src); printf("buf=%s\n", buf); return 0; }
在linux下運行得到的結果如圖:
分析:
首先要搞懂snprint()函數的功能。
int snprintf(char* buffer,int buf_size,const char* fomart,........)
當函數只有3個參數時,如果第三個參數沒有包含格式化信息,函數調用沒有問題;相反,如果第三個參數包含了格式化信息,但缺少后續對應參數,則程序運行結果不確定。
注意:格式化信息必須與變參個數相匹配。
在這個例子中,第三個參數src包含了格式化信息%s,但是我們沒有提供%s所需要的字符串,所以程序運行的結果如圖所示。
#include<stdio.h> int main() { char buf[10] = {0}; char src[] = "hello word"; snprintf(buf, sizeof(buf), src); printf("buf=%s\n", buf); return 0; }
運行結果如圖:
如果src里面包含格式化信息,則在snprintf()函數里面要添加第四個參數,且這個參數必須是字符串。
#include<stdio.h> int main() { char buf[11] = {0}; char src[] = "hello %s"; snprintf(buf, sizeof(buf), src,"world"); printf("buf=%s\n", buf); return 0; }
典型問題二:
#define STR "hello,\0D.T.Software\0" #include<stdio.h> int main() { char* src = STR; char buf[255] = { 0 }; printf(buf, sizeof(buf), src); printf("strlen(STR)=%d\n", strlen(STR)); //7 printf("sizeof(STR)=%d\n", sizeof(STR)); //22 printf("strlen(src)=%d\n",strlen(src)); //7 printf("sizeof(src)=%d\n",sizeof(src)); //4 printf("strlen(buf)=%d\n",strlen(buf)); //7 printf("sizeof(buf)=%d\n",sizeof(buf)); //255 printf("src=%s\n", src); //hello. printf("buf=%s\n", buf); //hello. return 0; }
分析:1.字符串相關的函數均以第一個出現的'\0'作為結束符。
2.編譯器總是會在字符串字面量的末尾添加'\0'。
3.字符串字面量的本質為數組。
字符串 字符數組 字符指針 三者的本質是不同的,但是他們相互之間又有聯系,字符串是一個特殊的字符數組,字符指針可以指向一個字符數組。因此,字符指針可以指向字符串。
典型問題三:
運行結果:
在程序運行的過程中GCC編譯器看到“D.T.Soft"已經被S1定義到了只讀存儲區,當發現"D.T.Soft”又被S2定義的時候 這個時候GCC編譯器會進行優化,將S1.S2映射到同一塊內存空間上面去。所以s1==s2是相等的。這樣避免了內存的浪費。
同樣,若是用strcmp(s1,s2)==0 ;這個時候返回的結果是True;因為strcmp()主要是比較s1.s2的內容。所以是相等的。
分析:
字符串之間的相等比較需要用strcmp完成
不可直接用==進行字符串直接的比較
完全相同的字符串字面量的==比較結果為false
注意:一些現代編譯器能夠將相同的字符串字面量映射到同一個無名字符數組,因此==比較結果為true;
典型問題四:
字符串循環右移
void right_shift_r(const char* src,char* result,unsigned int n);
函數功能:將輸入字符串src循環右移n位,result為輸出結果。
分析:
#include<stdio.h> #include<string.h> void right_shift_r(const char* src, char* result, unsigned int n) { 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); system("pause"); }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。