字串相關1.char *gets(char *s);#include<stdio.h>
功能: 從標準輸入讀入字元,並儲存到s指定的記憶體空間,直到出現換行符或讀到檔案結尾為止引數: s:字串首地址返回值: 成功:讀入的字串 失敗:NULL
gets(str)與scanf(“%s”,str)的區別: gets(str)允許輸入的字串含有空格 scanf(“%s”,str)不允許含有空格注意: 由於scanf()和gets()無法知道字串s大小,必須遇到換行符或讀到檔案結尾為止才接收輸入,因此容易導致字元陣列越界(緩衝區溢位)的情況。
舉例:
printf("請輸入str: ");gets(str);printf("str = %s\n", str);
2.char *fgets(char *s, intsize, FILE *stream);#include<stdio.h>
功能: 從stream指定的檔案內讀入字元,儲存到s所指定的記憶體空間,直到出現換行字元、讀到檔案結尾或是已讀了size - 1個字元為止,最後會自動加上字元 '\0' 作為字串結束
引數: s:字串 size:指定最大讀取字串的長度(size - 1) stream:檔案指標,如果讀鍵盤輸入的字串,固定寫為stdin
返回值: 成功:成功讀取的字串 讀到檔案尾或出錯: NULL描述: fgets()在讀取一個使用者透過鍵盤輸入的字串的時候,同時把使用者輸入的回車也做為字串的一部分。透過scanf和gets輸入一個字串的時候,不包含結尾的“\n”,但透過fgets結尾多了“\n”。fgets()函式是安全的,不存在緩衝區溢位的問題。
舉例:
char str[100];printf("請輸入str: ");fgets(str, sizeof(str), stdin);printf("str = \"%s\"\n", str);
3.int puts(const char *s);#include<stdio.h>功能: 標準裝置輸出s字串,在輸出完成後自動輸出一個'\n'。
引數: s:字串首地址。
返回值: 成功:非負數 失敗:-1舉例:
#include <stdio.h>int main(){ printf("hello world"); puts("hello world"); return 0;}
4.int fputs(const char *str, FILE *stream);#include<stdio.h>
功能: 將str所指定的字串寫入到stream指定的檔案中,字串結束符'\0'不寫入檔案。
引數: str:字串 stream:檔案指標,如果把字串輸出到螢幕,固定寫為stdout。
返回值: 成功:0 失敗:-1注意: fputs()是puts()的檔案操作版本,但fputs() 不會自動輸出一個'\n'。
舉例:
printf("hello world");puts("hello world");fputs("hello world", stdout);
5. size_t strlen(const char *s);#include<string.h>功能: 計算指定指定字串s的長度,不包含字串結束符‘\0’.
引數: s:字串首地址
返回值: 字串s的長度,size_t 為unsigned int型別
舉例:
char str[] = "abcdefg";int n = strlen(str);printf("n = %d\n", n);
6. char *strcpy(char *dest, const char *src);#include<string.h>
功能: 把src所指向的字串複製到dest所指向的空間中,'\0'也會複製過去
引數: dest:目的字串首地址 src:源字元首地址
返回值: 成功:返回dest字串的首地址 失敗:NULL 注意: 如果引數dest所指的記憶體空間不夠大,可能會造成緩衝溢位的錯誤情況。
舉例:
char dest[20] = "123456789";char src[] = "hello world";strcpy(dest, src);printf("%s\n", dest);
7. char *strncpy(char *dest, const char *src, size_tn);#include<string.h>功能: 把src指向字串的前n個字元複製到dest所指向的空間中,是否複製結束符看指定的長度是否包含'\0'。
引數: dest:目的字串首地址 src:源字元首地址 n:指定需要複製字串個數
返回值: 成功:返回dest字串的首地址 失敗:NULL
舉例:
char dest[20] ;char src[] = "hello world";strncpy(dest, src, 5);printf("%s\n", dest);dest[5] = '\0';printf("%s\n", dest);
8. char *strcat(char *dest, const char *src);#include<string.h>
功能: 將src字串連線到dest的尾部,‘\0’也會追加過去
引數: dest:目的字串首地址 src:源字元首地址
返回值: 成功:成功:返回dest字串的首地址 失敗:NULL
舉例:
char str[20] = "123";char *src = "hello world";printf("%s\n", strcat(str, src));
9. char *strncat(char *dest, const char *src, size_tn);#include<string.h>
功能: 將src字串前n個字元連線到dest的尾部,‘\0’也會追加過去
引數: dest:目的字串首地址 src:源字元首地址 n:指定需要追加字串個數
返回值: 成功:成功:返回dest字串的首地址 失敗:NULL
舉例:
char str[20] = "123";char *src = "hello world";printf("%s\n", strncat(str, src, 5));
10. int strcmp(const char *s1, const char *s2);#include<string.h>
功能: 比較 s1 和 s2 的大小,比較的是字元ASCII碼大小。
引數: s1:字串1首地址 s2:字串2首地址返回值: 相等:0 大於:>0 小於:<0舉例:
char *str1 = "hello world";char *str2 = "hello mike";if (strcmp(str1, str2) == 0){ printf("str1==str2\n");}elseif (strcmp(str1, str2) > 0){ printf("str1>str2\n");}else{ printf("str1<str2\n");}
11. int strncmp(const char *s1, const char *s2, size_tn);#include<string.h>
功能: 比較 s1 和 s2 前n個字元的大小,比較的是字元ASCII碼大小。
引數: s1:字串1首地址 s2:字串2首地址 n:指定比較字串的數量
返回值: 相等:0 大於:>0 小於:<0舉例:
char *str1 = "hello world";char *str2 = "hello mike";if (strncmp(str1, str2, 5) == 0){ printf("str1==str2\n");}elseif (strcmp(str1, "hello world") > 0){ printf("str1>str2\n");}else{ printf("str1<str2\n");}
12. int sprintf(char *str , const char *format, ...);#include<stdio.h>
功能: 根據引數format字串來轉換並格式化資料,然後將結果輸出到str指定的空間中,直到出現字串結束符 '\0' 為止。
引數: str:字串首地址 format:字串格式,用法和printf()一樣
返回值: 成功:實際格式化的字元個數 失敗: - 1
舉例:
char dst[100] = { 0 };int a = 10;char src[] = "hello world";printf("a = %d, src = %s", a, src);printf("\n");int len = sprintf(dst, "a = %d, src = %s", a, src);printf("dst = \" %s\"\n", dst);printf("len = %d\n", len);
13. int sscanf(const char *str, const char *format, ...);#include<stdio.h>功能: 從str指定的字串讀取資料,並根據引數format字串來轉換並格式化資料。
引數: str:指定的字串首地址 format:字串格式,用法和scanf()一樣
返回值: 成功:引數數目,成功轉換的值的個數 失敗: - 1
舉例:
char src[] = "a=10, b=20";int a;int b;sscanf(src, "a=%d, b=%d", &a, &b);printf("a:%d, b:%d\n", a, b);
14. char *strchr(const char *s, intc);#include<string.h>
功能: 在字串s中查詢字母c出現的位置。
引數: s:字串首地址 c:匹配字母(字元)
返回值: 成功:返回第一次出現的c地址 失敗: NULL
舉例:
char src[] = "ddda123abcd";char *p = strchr(src, 'a');printf("p = %s\n", p);
15. char *strstr(const char *haystack, const char *needle);#include<string.h>功能: 在字串haystack中查詢字串needle出現的位置。
引數: haystack:源字串首地址 needle:匹配字串首地址
返回值: 成功:返回第一次出現的needle地址 失敗: NULL
舉例:
char src[] = "ddddabcd123abcd333abcd";char *p = strstr(src, "abcd");printf("p = %s\n", p);
16.size_t strspn(const char* str1, const char* str2)#include<string.h>
功能: 用來計算str1字串開始部分匹配str2字串的字元個數返回值: 返回字串str1開頭連續包含字串str2內的字元數目。如果str所包含的字元都屬於str2,那麼返回str1的長度。如果str的第一個字元不屬於str2,那麼返回0
17.size_t strspn(const char* str1, const char* str2)功能: 用來計算str1字串開始部分不匹配str2字串的字元個數返回值: 返回字串str1開頭部分不出現在字串str2內的字元數目。
18. char *strtok(char *str, const char *delim);#include<string.h>功能: 來將字串分割成一個個片段。當strtok()在引數s的字串中發現引數delim中包含的分割字元時, 則會將該字元改為\0 字元,當連續出現多個時只替換第一個為\0。
引數: str:指向欲分割的字串 delim:為分割字串中包含的所有字元
返回值: 成功:分割後字串首地址 失敗: NULL
舉例:
int main(void){ char input[16]="abc,d"; char*p; /*strtok places a NULL terminator infront of the token,if found*/ p=strtok(input,","); if(p) printf("%s\n",p); /*Asecond call to strtok using a NULL as the first parameter returns a pointer to the character following the token*/ p=strtok(NULL,","); if(p) printf("%s\n",p); return 0;}
19. int atoi(const char *nptr);#include<stdlib.h>功能: atoi()會掃描 nptr字串, 跳過前面的 空格字元,直到遇到 數字或 正負號才開始做 轉換,而遇到 非數字或 字串結束符('\0')才 結束轉換,並將結果返回 返回值。
引數: nptr:待轉換的字串
返回值: 成功:轉換後整數 類似的函式有: atof():把一個小數形式的字串轉化為一個浮點數。 atol():將一個字串轉化為long型別
舉例:
char str1[] = "-10";int num1 = atoi(str1);printf("num1 = %d\n", num1);char str2[] = "0.123";double num2 = atof(str2);printf("num2 = %lf\n", num2);
20.long int strtol(const char nptr,char *endptr,int base);;#include<stdlib.h>
功能: strtol函式會將引數nptr字串根據引數base來轉換成長整型數,引數base範圍從2至36。引數: nptr:待轉換的字串 endptr:是一個指標的地址,該指標被設定為標識輸入數字結束字元的地址 base:表示以什麼進位制寫入數字
返回值: 該函式返回轉換後的長整數,如果沒有執行有效的轉換,則返回一個零值。 類似的函式有: strtoul():把字串轉換成unsigned 1ong型別的值 strtod():把字串轉換成double型別的值
舉例:
#include<stdio.h>#include<stdlib.h>#define LIM 30char *s_gets(char*st,int n);int main(){ char number[LIM]; char *end; long value; puts("Enter a number(empty line to quit):"); while(s_gets(number,LIM)&&number[0]!='\0') value=strtol(number,&end,10);/*十進位制*/ printf("base 10 input,base 10 output:%1d,stopped at %s(%d)\n",value,end,*end); value=strtol(number,&end,16);/*十六進位制*/ printf("base 16 input,base 10 output:%1d,stopped at %s(%d)\n",value,end,*end); puts("Next number:"); puts("Bye!\n"); return 0;}char*s gets(char*st,int n){ char* ret_val; int i=0; ret val=fgets(st,n,stdin); if (ret_val) while (st[i]l='\n'&& st[i]!='\0') i++; if(st[i] =='\n') st[i]='\0'; else while (getchar()!='\n') continue; return ret_val;}
下面是該程式的輸出示例:Enter a number(empty line to quit):10base 10 input,base 10 output:10,stopped at(0)base 16 input,base 10 output:16,stopped at(0)Next number:10atom base 10 input,base 10 output:10,stopped at atom(97)base 16 input,base 10 output:266,stopped at tom (116)Next number:
Bye! 首先注意,當base分別為10和16時,字串"10"分別被轉換成數字10和16。還要注意,如果==end指向一個字元,end就是一個字元==。因此,第1次轉換在讀到空字元時結束,此時end指向空字元。列印end會顯示一個空字串,以%d轉換說明輸出end顯示的是空字元的ASCIl碼。 對於第2個輸入的字串,當base為10時,==end的值是'a'字元的地址==。==所以列印end顯示的是字串“atom”==,列印*end顯示的是'a’字元的ASCIl碼。然而,當base為16時,'a'字元被識別為一個有效的十六進位制數,strtol()函式把十六進位制數10a轉換成十進位制數266。 strtol()函式最多可以轉換三十六進位制,'a'~'z'字元都可用作數字。strtoul()函式與該函式類似,但是它把字串轉換成無符號值。strtod()函式只以十進位制轉換,因此它值需要兩個引數。 許多實現使用itoa()和ftoa()函式分別把整數和浮點數轉換成字串。但是這兩個函式並不是C標準庫的成員,可以用sprintf()函式代替它們,因為sprintf()的相容性更好。 數字既能以字串形式儲存,也能以數值形式儲存。把數字儲存為字串就是儲存數字字元。例如,數字213以‘2’、’1’、3’、‘\0’的形式被儲存在字串陣列中。以數值形式儲存213,儲存的是int型別的值。 C要求用數值形式進行數值運算(如,加法和比較)。但是在螢幕上顯示數字則要求字串形式,因為螢幕顯示的是字元。printf()和sprintf()函式,透過%d和其他轉換說明,把數字從數值形式轉換為字串形式,scanf()可以把輸入字串轉換為數值形式。C還有一些函式專門用於把字串形式轉換成數值形式。 假設你編寫的程式需要使用數值命令形參,但是命令形引數被讀取為字串。因此,要使用數值必須先把字串轉換為數字。如果需要整數,可以使用atoi()函式(用於把字母數字轉換成整數),該函式接受一個字串作為引數,返回相應的整數值。
字元分類函式int isalnum(int c):檢查字元是否為數字或字母;(0~9,a~z,A~Z) int isalpha(int c):檢查字元是否為字母;(a~z, A~Z) int iscntrl(int c):檢查字元是否為控制字元;(八進位制000~037以及177的字元) int isdigit(int c):檢查字元是否為十進位制數字;(0~9) int isgraph(int c):檢查字元是否為圖形表示,依賴於使用語言的環境;0~9,a~z,A~Z,以及標點符號) int islower(int c):檢查字元是否為小寫的字母;(a~z) int isprint(int c):檢查字元是否為可列印的;(數字、字母、標點符號、空白字元) int ispunct(int c):檢查字元是否為標點符號;(! ” # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~等) int isspace(int c):檢查字元是否為空白字元;(TAB、換行、垂直TAB、換頁、回車、空格) int isupper(int c):檢查字元是否為大寫字母;(A~Z) int isxdigit(int c):檢查字元是否為十六進位制數字;(0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f)
字元轉換
int tolower(int c):轉化字元為小寫字母; int toupper(int c):轉化字元為大寫字母;