溫馨提示×

溫馨提示×

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

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

字符串典型問題分析

發(fā)布時間:2020-07-18 08:58:47 來源:網(wǎng)絡 閱讀: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()函數(shù)的功能。

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

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

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

在這個例子中,第三個參數(shù)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()函數(shù)里面要添加第四個參數(shù),且這個參數(shù)必須是字符串。

#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.字符串相關的函數(shù)均以第一個出現(xiàn)的'\0'作為結束符。

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

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

        

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


典型問題三:

字符串典型問題分析


運行結果:

字符串典型問題分析

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


分析:

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

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

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



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



典型問題四:

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

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

函數(shù)功能:將輸入字符串src循環(huán)右移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問一下細節(jié)

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

AI