天天看點

strlen,strcpy與strcnpy,strcat與strncat,strcmp 與 strncmp幾個講解

1.擷取字元串的長度:strlen

指的是字元串的長度,不會包含\0

2.拷貝字元串:strcpy,strcnpy

strcpy(str1,str2)

把str2的東西拷貝給str1變成一樣的 如果str1字元串為wangxinhua str2為heiheihei

把str1拷貝給str2的話那麼會造成溢出,越界了。隻能拷貝相同的字元長度

strcnpy(str1,str2,5(拷貝5個字元這裡不包括\0))

例如:

char str1[] = "wang xin hua";

char str2[40];

strcnpy(str1,str2,5)

str2[5] = '\0'//這裡需要手動添加結束符

printf("str2=%s\n",str2);

strncpy 的例子
int main()
{
    char str1[] = "To be or not to be";
    char str2[19];
    char str3[40];

    strncpy(str2, str1, sizeof(str2));//這裡的意思是把str2裡面的全部拷貝出來
    strncpy(str3, str2, 5);//這裡隻拷貝5個字元
    str3[5] = '\0';//這個加在了e後面 空格也算一個字元

    printf("%s\n", str1);
    printf("%s\n", str2);
    printf("%s\n", str3);

    return 0;
}
           

3.連接配接字元串:strcat和strncat

這倆個的差別在于strncat需要手動添加\0

char str1[100] = "wang x h";

char str2[] = "hei hei hei";

strcat(str1, " ");

strcat(str1, str2);

printf("str1: %s\n", str1);

strncat的例子

int main()
{
        char str1[20] = "I";
        char str2[20] = "love ";
        char str3[20] = "FishC.com!";

        strncat(str1, " ","\0");//"\0"這樣可以連接配接兩個字元串
        strncat(str1, str2,"\0");//也可以把"\0"換成5,意思就是把需要連接配接的字元中占5個位元組的字元連接配接到str1去

        strncat(str1, str3,"\0");//這裡和上面一樣可以随便用那種記住連接配接連個字元的時候看清需要的那個字元串是多少位元組的

        printf("str1: %s\n", str1);

        return 0;
}
           

4.對比兩個字元:strcmp 與 strncmp

strncmp的例子

int main()
{
        char str1[40] = "FishC";
        char str2[40] = "FishC.com";

        if (!strncmp(str1, str2, 5))//比較前5個字元是否相同
        {
                printf("str1和str2前5個字元相同!\n");
        }
        else
        {
                printf("str1和str2前5個字元不同!\n");
        }

        return 0;
}
           

總結:發現沒 這幾個帶n的限制條件的是不是(目标字元,源字元,任意位元組數)源字元後面是不是可以随意定義要多少個字元的大小。

練習1:請問下邊會列印什麼内容
int main()
{
    char str[] = "wang xin hua";
    str[7] = "\0";

    printf("sizeof str = %d\n",sizeof(str));
    printf("strlen str = %d\n",sizeof(str));
    return 0;
}
           

這裡就是求出字元長度的大小;

練習二
C 标準的 strncpy 函數經常被推薦作為一種替代 strcpy 函數,但不幸的是 strncpy 函數也會存在一些風險,你知道是什麼嗎?
安全的做法是:
int main()
{
    ……
    strncpy(str1, str2, n);
    str1[sizeof(str1) - 1] = '\0';
    ……
}
           

這裡就是\0的問題

練習三
寫一個程式模仿 strncmp 函數的實作比較兩個字元串 s1 和 s2,需要滿足以下要求
#define MAX 1000
int main()
{
    char str1[MAX];
    char str2[MAX];
    int i = 0;
    unsigned int n;
    printf("請輸入你想要輸入的字元串");
    while((str1[i++] = getchar()!='\n'));

    printf("請輸入第二組字元串");
    i = 0;
    while((str2[i++] = getchar()!= '\n'));

    printf("請輸入想要比較的字元數");
    scanf("%u",&n);

    for(i = 0;i < n;i++)
    {
        if(str1[i]-str2[i])
        {
            i++;
            break;
        }
    }

    printf("比較的結果是:%d\n",str1[i-1] - str2[i-1]);
    return 0;
}
           
練習4:這裡就是上面的改版
要求 A:定義一個長度為 21 的字元數組,用于存放使用者輸入的文本;
要求 B:如果使用者輸入的文本長度超過 20 個字元,且文本中存在空格,則截取至最接近末尾(第 20 個字元串)的空格;
要求 C:如果使用者輸入的文本長度超過 20 個字元,且文本中不存在空格,則列印前 20 個字元。

#define MAX 21
int main()
{
    int ch,space,i = 0;//定義3個變量
    char str[MAX];//定義最大值類型

    space = MAX -1;//索引下标移動到第20

    printf("請輸入一行文本:");
    while((ch = getchar())!='\n')//接收使用者輸入的資料
    {
        str[i++] = ch;
        if(i == MAX - 1)
        {
            break;
        }
        if(ch == ' ')
        {
            space = i;
        }
    }
    if(i >= MAX -1)
    {
        str[space] = '\0';//超過了的話就在索引20的位置結束
    }
    else
    {
        str[i] = '\0';//沒有超過直接結束
    }

    printf("你輸入的文本是:%s\n",str);
    return 0;
}
           

繼續閱讀