字串函數

#include<string.h>

參考網址:https://mycollegenotebook.medium.com/c-%E8%AA%9E%E8%A8%80%E7%AD%86%E8%A8%98-%E5%AD%97%E4%B8%B2-strings-ffe70ee5f5b8

[速查]

輸入:

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;

}

輸入兩個字串