C語言學習|字串(10.19)
阿新 • • 發佈:2018-12-16
基本概念
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’判斷是否遍歷結束
字串的輸入輸出
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; //返回連線後字串的首地址
}