一、介紹
本文將主要介紹字符串處理庫函數中的strlen、strcpy、strcat、strcmp、atoi等,主要由<string.h>頭文件提供。
二、strlen函數:求字符串的長度
strlen |
|
頭文件 |
#include<string.h> |
原型 |
size_t strlen(const char *s) |
說明 |
求出s指向的字符串的長度(不包括null字符)。 |
返回值 |
返回s指向的字符串的長度。 |
size_t strlen(const char *s) { size_t len = 0; while(*s++) len++; return len; }
二、strcpy和strncpy函數:復制字符串
strcpy |
|
頭文件 |
#include<string.h> |
原型 |
char *strcpy(char *s1,const char *s2); |
說明 |
將s2指向的字符串復制到s1指向的數組中。若s1和s2指向的內存空間重疊,則作未定義處理。 |
返回值 |
返回s1的值。 |
strncpy |
|
頭文件 |
#include<string.h> |
原型 |
char *strncpy(char *s1,const char *s2,size_t n); |
說明 |
將s2指向的字符串復制到s1指向的數組中。若s2的長度大於等於n,則復制到第n個字符為止。否則用null字符填充剩余部分。若s1和s2指向的內存空間重疊,則作未定義處理。 |
返回值 |
返回s1的值。 |
char *strcpy(char *s1,const char *s2) { char *tmp = s1; while(*s1++ = *s2++) ; return tmp; } char *strncpy(char *s1,const char *s2,size_t n) { char *tmp = s1; while(n){ if(!(*s1++ = *s2++)) break; //遇到'\0'就結束循環 n--; } while(n--) *s1++ = '\0'; //用'\0'填充剩余部分 return tmp; }
三、strcat和strncat函數:連接字符串
strcat |
|
頭文件 |
#include<string.h> |
原型 |
char *strcat(char *s1,const char *s2) |
說明 |
將s2指向的字符串連接到s1指向的末尾。若s1和s2指向的內存空間重疊,則作未定義處理 |
返回值 |
返回s1的值。 |
strncat |
|
頭文件 |
#include<string.h> |
原型 |
char *strncat(char *s1,const char *s2,size_t n); |
說明 |
將s2指向的字符串連接到s1指向的數組末尾。若s2的長度大於n則截斷超出部分。若s1和s2指向的內存空間重疊,則作未定義處理。 |
返回值 |
返回s1的值。 |
char *strcat(char *s1,const char *s2) { char *tmp = s1; while(*s1) s1++; //前進到s1的末尾處 while(*s1++ = *s2++) ; //循環復制直至遇到s2中的'\0' return tmp; } char *strncat(char *s1,const char *s2,size_t n) { char *tmp = s1; while(*s1) s1++; //前進到s1的末尾處 while(n--) if(!(*s1++ = *s2++)) break; //遇到'\0'就結束循環 *s1 = '\0'; //在s1的末尾插入'\0' return tmp; }
四、strcmp和strncmp函數:比較字符串的大小關系
strcmp |
|
頭文件 |
#include<string.h> |
原型 |
char *strcmp(char *s1,const char *s2) |
說明 |
比較s1指向的字符串和s2指向的字符串的大小關系。 |
返回值 |
若s1和s2相等,則返回0;若s1大於s2,則返回正整數值,反之返回負整數值。 |
strncmp |
|
頭文件 |
#include<string.h> |
原型 |
char *strncat(char *s1,const char *s2,size_t n); |
說明 |
比較s1指向的字符的數組和s2指向的字符的數組的前n個字符的大小關系。 |
返回值 |
若s1和s2相等,則返回0;若s1大於s2,則返回正整數值,反之返回負整數值。 |
int *strcmp(char *s1,const char *s2) { while(*s1 == *s2){ if(*s1 == '\0') return 0; s1++; s2++; } return (unsigned char)*s1 - (unsigned char)*s2; } int *strncmp(char *s1,const char *s2,size_t n) { while(n && *s1 && *s2){ if(*s1 != *s2) return (unsigned char)*s1 - (unsigned char)*s2; s1++; s2++; n--; } if(!n) return 0; //相等 if(*s1) return 1; //s1 > s2 return -1; //s1 < s2 }
五、atoi、atol和atof函數:轉換字符串
atoi |
|
頭文件 |
#include<stdlib.h> |
原型 |
int atoi(const char *nptr) |
說明 |
將nptr指向的字符串轉換為int型表示 |
返回值 |
返回轉換后的值。結果值不能用int型表示時的處理未定義。 |
atol |
|
頭文件 |
#include<stdlib.h> |
原型 |
long atol(const char *nptr) |
說明 |
將nptr指向的字符串轉換為long型表示 |
返回值 |
返回轉換后的值。結果值不能用long型表示時的處理未定義。 |
atof |
|
頭文件 |
#include<stdlib.h> |
原型 |
double atof(const char *nptr) |
說明 |
將nptr指向的字符串轉換為double型表示 |
返回值 |
返回轉換后的值。結果值不能用double型表示時的處理未定義。 |
//使用atoi函數的例子 #include<stdio.h> #include<stdlib.h> int main(void) { char str[128]; printf("請輸入字符串:"); scanf("%s",str); printf("轉換為整數后為%d。\n",atoi(str)); return 0; }