您好,登錄后才能下訂單哦!
典型問題一:
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()函數(shù)的功能。
int snprintf(char* buffer,int buf_size,const char* fomart,........)
當函數(shù)只有3個參數(shù)時,如果第三個參數(shù)沒有包含格式化信息,函數(shù)調(diào)用沒有問題;相反,如果第三個參數(shù)包含了格式化信息,但缺少后續(xù)對應參數(shù),則程序運行結果不確定。
注意:格式化信息必須與變參個數(shù)相匹配。
在這個例子中,第三個參數(shù)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()函數(shù)里面要添加第四個參數(shù),且這個參數(shù)必須是字符串。
#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.字符串相關的函數(shù)均以第一個出現(xiàn)的'\0'作為結束符。
2.編譯器總是會在字符串字面量的末尾添加'\0'。
3.字符串字面量的本質(zhì)為數(shù)組。
字符串 字符數(shù)組 字符指針 三者的本質(zhì)是不同的,但是他們相互之間又有聯(lián)系,字符串是一個特殊的字符數(shù)組,字符指針可以指向一個字符數(shù)組。因此,字符指針可以指向字符串。
典型問題三:
運行結果:
在程序運行的過程中GCC編譯器看到“D.T.Soft"已經(jīng)被S1定義到了只讀存儲區(qū),當發(fā)現(xiàn)"D.T.Soft”又被S2定義的時候 這個時候GCC編譯器會進行優(yōu)化,將S1.S2映射到同一塊內(nèi)存空間上面去。所以s1==s2是相等的。這樣避免了內(nèi)存的浪費。
同樣,若是用strcmp(s1,s2)==0 ;這個時候返回的結果是True;因為strcmp()主要是比較s1.s2的內(nèi)容。所以是相等的。
分析:
字符串之間的相等比較需要用strcmp完成
不可直接用==進行字符串直接的比較
完全相同的字符串字面量的==比較結果為false
注意:一些現(xiàn)代編譯器能夠?qū)⑾嗤淖址置媪坑成涞酵粋€無名字符數(shù)組,因此==比較結果為true;
典型問題四:
字符串循環(huán)右移
void right_shift_r(const char* src,char* result,unsigned int n);
函數(shù)功能:將輸入字符串src循環(huán)右移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"); }
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。