1. 程式人生 > >C語言學習|字串(10.19)

C語言學習|字串(10.19)

基本概念

1.字串:由字元組成的字元陣列,且最後一個元素為’\0’。 2.’\0‘佔一個位元組的記憶體,但它不計入字串的實際長度,只計入陣列的長度。 3.初始化: char str[6] = {‘H’,‘e’,‘l’,‘l’,‘o’,’\0’}; char str[] = {‘H’,‘e’,‘l’,‘l’,‘o’,’\0’}; char str[] = {“Hello”}; char str[] = “Hello”; 4.字元指標:指向字元型資料的指標變數。 5.字串的地址:字串常量本身就代表存放它常量的首地址,是一個地址常量(如: char * p = “Hello”; 與 char *p; p = “Hello”; 是等價的。由於"Hello"儲存在只讀常量儲存區中,此時,不能對p所指向的儲存單元進行寫操作,即 *p = 'W’是錯誤的)。 6.但如果"Hello"儲存在一個數組中,char str[10] = “Hello”; char *p = str;,則 *p = 'W’是正確的,表示將str中第一個字元修改為W。 7.對單個字元進行賦值操作可以使用賦值運算子,但字串不行,只能用strcpy()。 8.字元陣列的迴圈通常不使用計數控制,而使用條件控制,利用字串結束標誌’\0’判斷是否遍歷結束

。 9.為防止實參在被調函式中被修改,可在形參前面加const

字串的輸入輸出

1.按c格式符,一個字元一個字元單獨輸出:

for (i = 0; str[i] != '\0'; i++)
{
	printf("%c",str[i]);
}

2.按s格式符,整體輸出:

scanf("%s",**str**);           //注意:此處不用新增取地址符&
/*表示讀入一個字串,**直到遇到空白字元為止**,當遇到空白字元時,空白字元之後的字元留在了**輸入緩衝區**中,下次遇到scanf()時自動被讀取*/
printf("%s",str);
/*表示輸出一個字串,直到遇到'\0'為止*/

3.運用gets()函式:

gets(str);
/*以回車符'\n'作為字串終止符,同時將'\n'從輸入緩衝區讀走,但不作為字串的一部分,而scanf()不讀走'\n',仍留在緩衝區中*/

4.運用puts()函式:

puts(str);
/*從括號中引數的地址開始,依次輸出儲存單元中的字元,當遇到'\0'時結束,並且自動輸出一個換行符*/

5.運用fgets()函式:

fgets(str,sizeof(str),stdin);
/*限制輸入字串不超過陣列大小*/

gets()和scanf()存在的問題

不能限制輸入字串的長度,容易引起緩衝區溢位;使用這兩個函式時,要確保輸入字串的長度不超過字串的大小。

字串處理函式

前提:以下函式均包含在標頭檔案<string.h>中

函式功能 函式 功能描述及說明
求字串長度 strlen(str); 不包括’\0’
字串複製 strcpy(str1,str2); 將str2複製到str1中,確保str1足夠大
字串比較 strcmp(str1,str2); 比較ASCII值,str1>str2時,返回值>0,以此類推
字串連線 strcat(str1,str2); 將str2連線在str1後面,覆蓋’\0’,str1應足夠大
”n族“字串複製 strncpy(str1,str2,n); 將str2至多前n個字元複製到str1中
”n族“字串比較 strncmp(str1,str2,n); 至多比較n個字元
”n族“字串連線 strncat(str1,str2,n); 至多新增n個字元

程式碼

字串排序

#include <stdio.h>
#include <string.h>
#define N 150  //字串個數
#define MAX_LEN 150  //字串最大長度

void SortString (char str[][MAX_LEN],int n);

int main()
{
    int i,n;
    char name[N][MAX_LEN];
    printf("How many countries?");
    scanf("%d",&n);
    getchar();   //讀走緩衝區的回車符
    printf("Input there names:\n");
    for (i = 0; i < n; i++)
        gets(name[i]);    //輸入n個字串
    SortString(name,n);
    printf("Sorted results:\n");
    for (i = 0; i < n; i++)
        puts(name[i]);    //輸出排序後的n個字串

    return 0;
}
/*交換法實現字串按字典順序排列*/
void SortString (char str[][MAX_LEN],int n)
{
    int i,j;
    char temp[MAX_LEN];
    for (i = 0; i < n-1; i++)
        for (j = i+1; j < n; j++)
            if (strcmp(str[i],str[j]) > 0)
            {
                strcpy(temp,str[i]);
                strcpy(str[i],str[j]);
                strcpy(str[j],temp);
            }
    return;
}

函式實現字串複製

void MyStrcpy (char desStr[],char srcStr[])
{
    int i = 0;
    while (srcStr[i] != '\0')
    {
        dstStr[i] = srcStr[i];
        i++;
    }
    dstStr[i] = '\0';
}
void MyStrcpy (char *desStr,char *srcStr)
{
    while (*srcStr != '\0')
    {
        *dstStr = *srcStr;
        srcStr++;
        dstStr++;
    }
    *dstStr = '\0';
}

函式實現字串連線

/*返回連線後字串的首地址*/
char *MyStrcat (char *dstStr,char *srcStr)
{
    char *pStr = dstStr;
    /*將指標移到字串dstStr的末尾*/
    while (*dstStr != '\0')
        dststr++;
    for (; *srcStr != '\0'; dstStr++,srcStr++)
        *dstStr = *srcStr;
    *dstStr = '\0';
    return pStr;    //返回連線後字串的首地址
}