- 前言:
字串與字元陣列
C語言的資料型態裡,未提供字串的資料型態,
有些像是C++有提供string資料型態、培基(BASIC)語言有1Bytes或2Bytes的字串變數。
C語言是將字串,拆成字元,儲存於陣列,
換句話說,就是將一個個的字元char,分別儲存到陣列元素中。
但是C並不會辨識字串何時結束,
必須在儲存的最後一個字元後一元素,儲存一結束(NULL)字元'\0'。
若沒有儲存結束字元 '\0' 的陣列,稱之為字元陣列,
字元陣列會是一連續的記憶體位址,而字串是一筆資料。
如果使用scanf()裡的 %s 讀取,scanf函式會自動補入 '\0',
若使用其他字元輸入函式,則需程式設計者自己補上 '\0'。
使用 "a" 與 'a' 的差別,"a" 就是 'a'+'\0'
- 宣告與存放
宣告一字元變數ch,存放一個字元 a.
char ch='a';
宣告一個字元陣列,並存入Hello World!
char myword[]={'H','e','l','l','o',' ','W','o','r','l','d','!'};
宣告一個字串,尾端補\0的字元,視為字串
char myword[]={'H','e','l','l','o',' ','W','o','r','l','d','!','\0'};
- 範例1:
請執行下列程式,看看結果:
#include <stdio.h>
str_print( char myword[] ) //將字元陣列印出的函數
{
printf("%c", myword[0]);
printf("%c", myword[1]);
printf("%c", myword[2]);
printf("%c", myword[3]);
printf("\n");
}
main() {
char myword[] = {'H','e','l','l','o',' ','W','o','r','l','d','!','\0'};
str_print( myword );
return 0;
}
是不是只印出部分的字元?
請試試修改函數和程式,(改以迴圈重複來將字元陣列印出)
讓這個宣告的字串能完整印出來。
但是如上述宣告方式,有些繁瑣,所以C的字串使用""括住,
在宣告時,則會自動在字串的尾端幫你補上'\0'.
char myword[] = "Hello World!";
範例2:將範例1中的宣告,換成字串來試試.
#include <stdio.h>
str_print( char myword[] ) //將字元陣列印出來的函數
{
//...略
printf("\n");
}
main() {
char myword[] = "Hello World!";
str_print( myword );
return 0;
}
執行看看結果如何?
另外,C語言提供string.h的函式庫
strlen( s ); //傳回目標字串的長度(字元數),不包括'\0'或Null.
strcpy( s1, s2 ); //字串複製函數, 將s2複製到s1上
strcmp( s1, s2 ); //比較兩字串s1, s2是否一樣(一個個字元比)
strcat( s1, s2 ); //將字串s2,串接到
s1後,以s1傳回(需注意s1長度要為strlen(s1)+strlen(s2))
以下為非標準函數(在Windows(VC, MinGW能用)):
strupr( s ); //將字串s的字元轉大寫A..Z(非字母不轉換)
strlwr( s ); //將字串s的字元轉小寫a..z(非字母不轉換)
- 範例3:
執行下列程式,觀察執行結果:
#include <stdio.h>
#include <string.h>
main() {
char str[] = "Hello World!";
int length = sizeof(str) / sizeof(str[0]);
int i;
for(i = 0; i < length; i++) {
if(str[i]=='\0') printf(" \\n");
else printf("%c", str[i]);
}
printf("\n");
printf("陣列長: %d\n", length);
printf("字串長: %d\n", strlen(str));
return 0;
}
- 練習1:
請寫一個程式,可以計算你輸入字串的長度。
例如: The Length of string: "Hello
World!" is 12.
- 練習2:
請寫一個程式,將上題字串反轉輸出。
例如: The reverse of input string:
"!dlroW olleH".
|
|