字串函數
#include<string.h>
[速查]
輸入:
scanf():遇空白結束,無法輸入空白字元。
ex: scanf ("%s",name);
gets():遇Enter結束、可讀入空白字元,結尾加上NULL,較不安全。
ex: gets (name);
gets()不安全參考資料:https://iter01.com/347171.html
※C11之後的版本已經停用gets()※
fgets():遇Enter結束、可讀入空白字元,較安全,字串自動加上\n。
ex: fgets (name, 20, stdin);
輸出:
fputs():
ex: fputs(name, stdout);
puts():
ex: puts(name); // 會自動換行
printf():
ex: printf("%d",num);
轉換函式:
sprintf():將不同的資料型態轉換成字串(string)
ex:
char country[]="Taipei";
int tmp=20;
sprintf(weather, "%s is about %d degrees.", country, tmp);
printf("%s",weather);
將country、tmp整合成字串放入weather中。
結果:Taipei is about 20 degrees.
sscanf():讀取字串,並個別放入新的字串中。(切割出不同字串或數字)
ex: char str[100] = "100 math";
char obj[10];
int grade;
sscanf(str, "%d %s", &grade, obj);
讀取字串str中100和math,並且個別存入grade跟obj中 。
strlen() — 字串長度
strcat() — 合併兩個字串
ex: strcat(合併到的字串,被合併的字串);
strncat(str1(合併後字串), str2(來源字串), n) ,將str2的前n個字母合併到str1上。
ex: strncat(str1,"This is",3); //將Thi併入str1後面。
strcpy() — 複製字串
ex: strcpy(str2,str1); //將str1複製到str2
strncpy() — 複製n個字元
ex: strncpy(str2,"This is...",3); //將"Thi"複製到str2
strcmp() — 比較兩個字串,依照ASCII一一比對。
ex: int cmp = strcmp(str1,str2);
>0: str1的字元大於str2。
=0: str1的字元等於str2的字元。
<0: str1的字元小於str2。
strncmp() — 比較兩個字串的前n個字元。
ex: if(strncmp(str[n],"AAxx",2)==0))
//比較str[n]和AAxx前面兩個字元
strchr(str1, c) — 回傳字元在str1上的哪一個位置,找不到回傳NULL值。
strrchr(str1, c) — 從後面往前找字元在str1上的位置,找不到回傳NULL值。
※將strchr、strrchr找到的位置(位址)放入指標變數,以方便計算。
strstr(str1, str2) — 回傳一個指標,指標內容是在str1中第一次出現的str2,如果沒找到則回傳NULL值。
ex: char str[] = "This is a simple string";
char * pch;
pch = strstr (str,"simple");
※pch內容為"simple string"。
字串轉換成數字
1.atoi , ACSII convert to integer
2.atof , ACSII convert to float
3.atol , ACSII convert to long integer
必須 include<stdlib.h>
char str[10]="123",fdig[10]={'4','5','.','6','7','\0'};
int i=atoi(str); //結果為123
double j=atof(fdig); //結果為45.67,遇非數字\0停止
[宣告]
char 字串名稱[長度] = "內容";
例如:
char str1[6] = "hello"; //字串雙引號
char str1[6] = { 'h' , 'e' , 'l' , 'l' , 'o' , '\0' }; //字元單引號
char str2[] = { 's' , 't' , 'a' , 'r' , 't' , '\0' }; //長度6
字串就是字元陣列,以\0作為結束,記得要多宣告一個位置給\0。
[字串輸入] scanf() , gets(), fgets()
scanf():
char name[20]; int age;
scanf("%s %d",name,&age);
※字串輸入不使用&、數字則要(表示變數位址)。
※scanf()讀到空白會自動結束。
※gets()遇到enter(newline)時才會結束。(不安全)
※建議使用fgets()較安全。
fgets():
fgets(字串名稱,讀取長度,stdin);
範例:
#include <stdio.h>
#include <string.h>
int main(){
char name[20];
fgets (name, 20, stdin);
puts(name); //使用puts()一定會換行,不論是否為\n
return 0; }
輸入:0123456789 0123456789
輸出:0123456789 01234567
※最後面會保留給\n,所以只讀到7為止。
fgets()使用printf()輸出時,自動多加換行\n,不想於輸出時換行,則可以將\n以程式換成\0。
if(name[strlen(name)-1]=='\n')
name[strlen(name)-1] = '\0';
[字串輸出] fputs(), puts(), printf()
puts():自動換行
範例:puts(name);
fputs():必須指定輸出stdout。
範例:fputs(name,stdout);
將不同的資料型態轉換成字串(string)
使用函式sprintf, sscanf
sprintf(str,"%s %d",name,age); //合併name和age到字串str。
sscanf(str,"%s %d",name,&age); //將str內的字串與數字分別存到name及age,age之前加&表示記憶體位址。
<string.h>應用
strlen() — 得到字串長度
範例:strlen(str);
strcat() — 合併兩個字串
範例:strcat(str1,str2); //將str2合併到str1後面。
strncat(str1(被合併的字串), str2(原本的字串), n) — 將str2的前n個字母合併到str1上。
範例:strncat (str1, str2, 4); //將str2中前4個字母合併到str1上 。
strcpy() — 複製字串
範例:strcpy(str2,str1); //將str1複製到str2
strncpy(str1, str2, n) — 從第str2中的第n個字母複製到str1上。
範例:strncpy ( str3, str2, 5 ); //str2中的前五個字母複製到str3上。
str3[5] = '\0'; /* 在str3上加一個結束符號 */
strncpy ( str2, str1, sizeof(str2) ); // 將str1複製到str2上。
strcmp() — 比較兩個字串
int cmp = strcmp(str2被比對的字串, str1要比對的字串);
str1 > str2,回傳 >0的值
str1 == str2,回傳 =0的值
str1 < str2,回傳 <0的值
strncmp(str1, str2, n)
回傳=0,當 str1的前n個 = str2的前n個相同
回傳>0,當 str1的前n個 > str2的前n個
回傳<0,當 str1的前n個 < str2的前n個
strchr(str1, c) — 回傳字母 c 在str1上的哪一個位置
※當沒找到字母c,就會回傳NULL。
使用自訂義變數string
範例:
typedef const char* String;
struct Account {
String id;
String name;
double balance;
};
void printAcct(struct Account acct) {
printf("Account(%s, %s, %f)\n", acct.id, acct.name, acct.balance);
}
int main() {
struct Account acct;
acct.id = "123-456-789";
acct.name = "張庭禎";
acct.balance = 1000;
printAcct(acct); // 顯示 Account(123-456-789, 張庭禎, 1000.000000)
return 0;
}