字符串典型問題分析

典型問題一:

   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下運行得到的結果如圖:

捕獲1.PNG

分析:

首先要搞懂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;
}

運行結果如圖:

2.PNG

如果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;
}

4.PNG

典型問題二:

#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.字符串字面量的本質爲數組。

        

  字符串   字符數組  字符指針 三者的本質是不同的,但是他們相互之間又有聯繫,字符串是一個特殊的字符數組,字符指針可以指向一個字符數組。因此,字符指針可以指向字符串。


典型問題三:

1.PNG


運行結果:

2.PNG

在程序運行的過程中GCC編譯器看到“D.T.Soft"已經被S1定義到了只讀存儲區,當發現"D.T.Soft”又被S2定義的時候 這個時候GCC編譯器會進行優化,將S1.S2映射到同一塊內存空間上面去。所以s1==s2是相等的。這樣避免了內存的浪費。

同樣,若是用strcmp(s1,s2)==0 ;這個時候返回的結果是True;因爲strcmp()主要是比較s1.s2的內容。所以是相等的。


分析:

  1. 字符串之間的相等比較需要用strcmp完成

  2. 不可直接用==進行字符串直接的比較

  3. 完全相同的字符串字面量的==比較結果爲false



    注意:一些現代編譯器能夠將相同的字符串字面量映射到同一個無名字符數組,因此==比較結果爲true;



典型問題四:

  字符串循環右移

void right_shift_r(const char* src,char* result,unsigned int n);

函數功能:將輸入字符串src循環右移n位,result爲輸出結果。

3.PNG


分析:

4.PNG

#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");
}

5.PNG


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章