中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

字符串典型問題分析

發布時間:2020-07-18 08:58:47 來源:網絡 閱讀:181 作者:peter2017 欄目:編程語言

典型問題一:

   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()函數的功能。

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

運行結果如圖:

字符串典型問題分析

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

字符串典型問題分析

典型問題二:

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

        

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


典型問題三:

字符串典型問題分析


運行結果:

字符串典型問題分析

在程序運行的過程中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為輸出結果。

字符串典型問題分析


分析:

字符串典型問題分析

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

字符串典型問題分析


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清水河县| 滁州市| 平山县| 宣城市| 绵竹市| 乐安县| 都昌县| 汾西县| 托里县| 汤阴县| 嘉善县| 广水市| 介休市| 延津县| 韶关市| 会理县| 陇西县| 江城| 泰来县| 高要市| 诸城市| 武定县| 昌黎县| 宣城市| 江永县| 伊春市| 辽阳县| 临颍县| 温州市| 新竹市| 连城县| 襄垣县| 大荔县| 上蔡县| 法库县| 盐源县| 宝山区| 博客| 平潭县| 盐山县| 乳山市|