今天又遇見幾個好題,和以前的一些湊一塊寫一篇文章,作為我延遲去自習室的一個借口吧。
首先是第一題
1 int fun(char* s){ 2 char* t = s; 3 while(*t++); 4 return t-s; 5 } 6 fun函數的功能是_______ 7 比較兩個字符串的大小 8 計算s所指字符串占用內存的大小 9 技術s所指字符串的長度 10 將s所指字符串復制到字符串t中
題目有四個選項,為什么我會選這個題呢,因為自己在面試C++的崗位中第一次遇見,印象里好像是寫錯了,然后在練習C語言計算機二級時候遇見不少變種,最后別人在群里問這個題目,還因為第二個和第三個選項給吵起來了……如此種種。
題目很經典,在於你有C語言的基本功后,可以成功的排除第一個和第四個選項,知道函數返回的是一個int值,而且還和這個字符串的長度有關。那么除去長度后第二個選項也不能排除,因為占用內存大小剛剛好比字符串的長度多一個字節,相當於是\0,那這個時候就需要分析運算符的優先級了。
*t++相當於*(t++)因為兩個運算符優先級相同,而且是右結合的。然后就可以將其拆分為兩個表達式:*t和t++
兩個表達式要不就都運行,要不就都不運行。最后一次到\0時,while中的t還做了一次++操作,所以此時s指向字符串開頭,t指向字符串\0的后一個位置,兩者相減等於strlen(s)+1,也就是sizeof(s);
見運行代碼和結果:
char a[]="lavender"; printf("sizeof %s is %d\n",a,sizeof(a)); printf("length %s is %d\n",a,strlen(a)); printf("%s length is %d",a,fun(a)); 運行結果 sizeof lavender is 9 length lavender is 8 lavender length is 9 Process returned 0 (0x0) execution time : 0.463 s Press any key to continue.
好的,第二題:
int main() { char a[]="lavender"; char b[100]="lavender"; char* c ="lavenderdfdf"; printf("%p,%p,%p\n",a,b); printf("sizeof a is %d\n",sizeof(a)); printf("sizeof b is %d\n",sizeof(b)); printf("sizeof c is %d",sizeof(c)); return 0; }
輸出是啥?你猜猜咯,順便說一聲,我的編譯器的環境是32位的。

0028FF03,0028FE9F,0028FE98 sizeof a is 9 sizeof b is 100 sizeof c is 4 Process returned 0 (0x0) execution time : 3.255 s Press any key to continue.
那么這個涉及到sizeof的一些用法,我自己也是半桶水,而且還寫錯了,引用一個鏈接,不權威,大家自己找答案:解析
第三個題目
下列選項中,能正確對字符串賦值的是 char s[5]={'A','b','c','d','e'}; char *s = "ABCDE"; char s[4][5]={"ABCDE"}; char *s;gets(s); char s[5]="hi";s="bby";
請注意,只有第二個是對的哈。第一個末尾沒有\0
第三個中的第一個字符串數組越界
第四個s沒有初始空間
第五個字符數組的名字是常量,不可以更改