真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

字符串典型問題分析

典型問題一:

成都創(chuàng)新互聯(lián)主要從事網(wǎng)站建設、網(wǎng)站設計、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務澤州,十多年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:13518219792

   1.下面的程序輸出什么為什么?


#include
int main()
{

    char buf[10] = {0};
    char src[] = "hello %s";
    snprintf(buf, sizeof(buf), src);
    printf("buf=%s\n", buf);
    return 0;
}

在linux下運行得到的結(jié)果如圖:

字符串典型問題分析

分析:

首先要搞懂snprint()函數(shù)的功能。

int snprintf(char* buffer,int buf_size,const char* fomart,........)

當函數(shù)只有3個參數(shù)時,如果第三個參數(shù)沒有包含格式化信息,函數(shù)調(diào)用沒有問題;相反,如果第三個參數(shù)包含了格式化信息,但缺少后續(xù)對應參數(shù),則程序運行結(jié)果不確定。

注意:格式化信息必須與變參個數(shù)相匹配。

在這個例子中,第三個參數(shù)src包含了格式化信息%s,但是我們沒有提供%s所需要的字符串,所以程序運行的結(jié)果如圖所示。

#include
int main()
{

    char buf[10] = {0};
    char src[] = "hello word";
    snprintf(buf, sizeof(buf), src);
    printf("buf=%s\n", buf);
    return 0;
}

運行結(jié)果如圖:

字符串典型問題分析

如果src里面包含格式化信息,則在snprintf()函數(shù)里面要添加第四個參數(shù),且這個參數(shù)必須是字符串。

#include
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
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'作為結(jié)束符。

           2.編譯器總是會在字符串字面量的末尾添加'\0'。

           3.字符串字面量的本質(zhì)為數(shù)組。

        

  字符串   字符數(shù)組  字符指針 三者的本質(zhì)是不同的,但是他們相互之間又有聯(lián)系,字符串是一個特殊的字符數(shù)組,字符指針可以指向一個字符數(shù)組。因此,字符指針可以指向字符串。


典型問題三:

字符串典型問題分析


運行結(jié)果:

字符串典型問題分析

在程序運行的過程中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 ;這個時候返回的結(jié)果是True;因為strcmp()主要是比較s1.s2的內(nèi)容。所以是相等的。

分析:

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

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

  3. 完全相同的字符串字面量的==比較結(jié)果為false

    注意:一些現(xiàn)代編譯器能夠?qū)⑾嗤淖址置媪坑成涞酵粋€無名字符數(shù)組,因此==比較結(jié)果為true;

典型問題四:

  字符串循環(huán)右移

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

函數(shù)功能:將輸入字符串src循環(huán)右移n位,result為輸出結(jié)果。

字符串典型問題分析


分析:

字符串典型問題分析

#include
#include

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

字符串典型問題分析


分享名稱:字符串典型問題分析
當前地址:http://weahome.cn/article/iipgpd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部