C語言之字符串典型例題解析


今天又遇見幾個好題,和以前的一些湊一塊寫一篇文章,作為我延遲去自習室的一個借口吧。

首先是第一題

 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沒有初始空間

第五個字符數組的名字是常量,不可以更改

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM