1. 程式人生 > 實用技巧 >C語言字串處理庫函式大全

C語言字串處理庫函式大全

C語言中最常用標準庫函式
C++ sizeof的使用總結
C++ Builder cstdlib 標準庫函式
相關顏色的十六進位制值
C++中幾個罕見卻有用的預編譯和巨集定義
Windows常用快捷鍵

一、string.h中字串處理函式

在標頭檔案<string.h>中定義了兩組字串函式。第一組函式的名字以str開頭;第二組函式的名字以mem開頭。
只有函式memmove對重疊物件間的拷貝進行了定義,而其他函式都未定義。比較類函式將其變數視為unsigned char型別的陣列。

1 strcpy

#include <string.h>
char *strcpy(char *str1, const char *str2);
把字串str2(包括'\0')拷貝到字串str1當中,並返回str1。

2 strncpy

#include <string.h>
char *strncpy(char *str1, const char *str2, size_t count);
把字串str2中最多count個字元拷貝到字串str1中,並返回str1。如果str2中少於count個字元,那麼就用'\0'來填充,直到滿足count個字元為止。

3 strcat

#include <string.h>
char *strcat(char *str1, const char *str2);
把str2(包括'\0')拷貝到str1的尾部(連線),並返回str1。其中終止原str1的'\0'被str2的第一個字元覆蓋。

4 strncat

#include <string.h>
char *strncat(char *str1, const char *str2, size_t count);
把str2中最多count個字元連線到str1的尾部,並以'\0'終止str1,返回str1。其中終止原str1的'\0'被str2的第一個字元覆蓋。
注意,最大拷貝字元數是count+1。

5 strcmp

#include <string.h>
int strcmp(const char *str1, const char *str2);
按字典順序比較兩個字串,返回整數值的意義如下:
小於0,str1小於str2;
等於0,str1等於str2;
大於0,str1大於str2;

6 strncmp

#include <string.h>
int strncmp(const char *str1, const char *str2, size_t count);
同strcmp,除了最多比較count個字元。根據比較結果返回的整數值如下:
小於0,str1小於str2;
等於0,str1等於str2;
大於0,str1大於str2;

7 strchr

#include <string.h>
char *strchr(const char *str, int ch);
返回指向字串str中字元ch第一次出現的位置的指標,如果str中不包含ch,則返回NULL。

8 strrchr

#include <string.h>
char *strrchr(const char *str, int ch);
返回指向字串str中字元ch最後一次出現的位置的指標,如果str中不包含ch,則返回NULL。

9 strspn

#include <string.h>
size_t strspn(const char *str1, const char *str2);
返回字串str1中由字串str2中字元構成的第一個子串的長度。

10 strcspn

#include <string.h>
size_t strcspn(const char *str1, const char *str2);
返回字串str1中由不在字串str2中字元構成的第一個子串的長度。

11 strpbrk

#include <string.h>
char *strpbrk(const char *str1, const char *str2);
返回指向字串str2中的任意字元第一次出現在字串str1中的位置的指標;如果str1中沒有與str2相同的字元,那麼返回NULL。

12 strstr

#include <string.h>
char *strstr(const char *str1, const char *str2);
返回指向字串str2第一次出現在字串str1中的位置的指標;如果str1中不包含str2,則返回NULL。

13 strlen

#include <string.h>
size_t strlen(const char *str);
返回字串str的長度,'\0'不算在內。

14 strerror

#include <string.h>
char *strerror(int errnum);
返回指向與錯誤序號errnum對應的錯誤資訊字串的指標(錯誤資訊的具體內容依賴於實現)。

15 strtok

#include <string.h>
char *strtok(char *str1, const char *str2);
在str1中搜索由str2中的分界符界定的單詞。
對strtok()的一系列呼叫將把字串str1分成許多單詞,這些單詞以str2中的字元為分界符。第一次呼叫時str1非空,它搜尋str1,找出由非str2中的字元組成的第一個單詞,將str1中的下一個字元替換為'\0',並返回指向單詞的指標。隨後的每次strtok()呼叫(引數str1用NULL代替),均從前一次結束的位置之後開始,返回下一個由非str2中的字元組成的單詞。當str1中沒有這樣的單詞時返回NULL。每次呼叫時字串str2可以不同。
如:

char *p;
p = strtok("The summer soldier,the sunshine patriot", " ");
printf("%s", p);
do {
    p = strtok("\0", ", "); /* 此處str2是逗號和空格 */
    if (p)
        printf("|%s", p);
} while (p);

顯示結果是:The | summer | soldier | the | sunshine | patriot

16 memcpy

#include <string.h>
void *memcpy(void *to, const void *from, size_t count);
把from中的count個字元拷貝到to中。並返回to。

17 memmove

#include <string.h>
void *memmove(void *to, const void *from, size_t count);
功能與memcpy類似,不同之處在於,當發生物件重疊時,函式仍能正確執行。

18 memcmp

#include <string.h>
int memcmp(const void *buf1, const void *buf2, size_t count);
比較buf1和buf2的前count個字元,返回值與strcmp的返回值相同。

19 memchr

#include <string.h>
void *memchr(const void *buffer, int ch, size_t count);
返回指向ch在buffer中第一次出現的位置指標,如果在buffer的前count個字元當中找不到匹配,則返回NULL。

20 memset

#include <string.h>
void *memset(void *buf, int ch, size_t count);
把buf中的前count個字元替換為ch,並返回buf。

二、stdlib.h中字串與數字相互轉換處理函式

1. 數字轉化為字串:

● itoa():將整型值轉換為字串。
● ltoa():將長整型值轉換為字串。
● ultoa():將無符號長整型值轉換為字串。
● gcvt():將浮點型數轉換為字串,取四捨五入。
● ecvt():將雙精度浮點型值轉換為字串,轉換結果中不包含十進位制小數點。
● fcvt():指定位數為轉換精度,其餘同ecvt()。
例子:

# include <stdio.h>
# include <stdlib.h>
int main ()
{
   int num_int = 435;
   double num_double = 435.10f;
   char str_int[30];
   char str_double[30];
   itoa(num_int, str_int, 10);  //把整數num_int轉成字串str_int
   gcvt(num_double, 8, str_double);  //把浮點數num_double轉成字串str_double
   printf("str_int: %s\n", str_int);
   printf("str_double: %s\n", str_double);
   return 0;
}

程式輸出結果:
str_int: 435
str_double: 435.10001
● 程式碼第11行中的引數10表示按十進位制型別進行轉換,轉換後的結果是“435”,如果按二進位制型別進行轉換,則結果為“1101110011”。
● 程式碼第12行中的引數8表示精確位數,這裡得到的結果是“435.10001”。

2. 字串轉化為數字

● atof():將字串轉換為雙精度浮點型值。
● atoi():將字串轉換為整型值。
● atol():將字串轉換為長整型值。
● strtod():將字串轉換為雙精度浮點型值,並報告不能被轉換的所有剩餘數字。
● strtol():將字串轉換為長整值,並報告不能被轉換的所有剩餘數字。
● strtoul():將字串轉換為無符號長整型值,並報告不能被轉換的所有剩餘數字。
例子:

# include <stdio.h>
# include <stdlib.h>
int main ()
{
    int num_int;
    double num_double;
    char str_int[30] = "435";         //將要被轉換為整型的字串
    char str_double[30] = "436.55";  //將要被轉換為浮點型的字串
    num_int = atoi(str_int);          //轉換為整型值
    num_double = atof(str_double);  //轉換為浮點型值
    printf("num_int: %d\n", num_int);
    printf("num_double: %lf\n", num_double);
    return 0;
}

輸出結果:
num_int: 435
num_double: 436.550000

三. C++字串,數字相互轉換

一.將CString轉為CTime的幾種方法

CString   timestr   =   "2000年04月05日";  
  int   a,b,c   ;  
  sscanf(timestr.GetBuffer(timestr.GetLength()),"%d年%d月%d日",&a,&b,&c);  
  CTime   time(a,b,c,0,0,0);    

 CString   s("2001-8-29   19:06:23");  
  int   nYear,   nMonth,   nDate,   nHour,   nMin,   nSec;  
  sscanf(s,   "%d-%d-%d   %d:%d:%d",   &nYear,   &nMonth,   &nDate,   &nHour,   &nMin,   &nSec);  
  CTime   t(nYear,   nMonth,   nDate,   nHour,   nMin,   nSec);

CString   timestr   =   "2000年04月05日";  
  int   year,month,day;  
  BYTE   tt[5];  
  //get   year  
  memset(tt,   0,   sizeof(tt));  
  tt[0]   =   timestr[0];  
  tt[1]   =   timestr[1];  
  tt[2]   =   timestr[2];  
  tt[3]   =   timestr[3];  
  year=   atoi((char   *)tt);  
   
  //get   month  
  memset(tt,   0,   sizeof(tt));  
  tt[0]   =   timestr[6];  
  tt[1]   =   timestr[7];  
  month   =   atoi((char   *)tt);  
   
  //get   day  
  memset(tt,   0,   sizeof(tt));  
  tt[0]   =   timestr[10];  
  tt[1]   =   timestr[11];  
 
  CTime   time(year,month,day,0,0,0);

從上面來看,很明顯使用sscanf()函式的優勢.

二.將CTIme轉換為CString的方法:

CTime  tmSCan = CTime::GetCurrentTime();
CString szTime = tmScan.Format("'%Y-%m-%d %H:%M:%S'");

這樣得到的日期時間字串就是以"2006-11-27 23:30:59"的格式.這是不是很方便呢?

 //取得CTime中的日期
 CString cstrDate = tmScan.Format("%Y-%m-%d");
 //取得CTime中的時間
 CString cstrTime = tmScan.Format("%H:%M-%S");

sprintf還有個不錯的表妹:strftime,專門用於格式化時間字串的,用法跟她表哥很像,也是一大堆格式控制符,只是畢竟小姑娘家心細,她還要呼叫者指定緩衝區的最大長度,可能是為了在出現問題時可以推卸責任吧。這裡舉個例子:
更多更好的sprintf()函式說明參考:《spirntf,你知道多少?》

time_t t = time(0);
      //產生"YYYY-MM-DD hh:mm:ss"格式的字串。
char s[32];
strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&t));

sprintf在MFC中也能找到他的知音:CString::Format,strftime在MFC中自然也有她的同道:CTime::Format,這一對由於從面向物件哪裡得到了贊助,用以寫出的程式碼更覺優雅。

三, 字串轉換為數值型別

將字串"20.0E6"轉換為數字

1,sscanf("20.0e5","%d",&x);
2,atof("20.0E6");

許多人用atoi(), atof() 和這個“家族”中的其它函式. 它們方便應用,但是有一個重要的缺點:
在轉換失敗和轉換字串"0"時都返回0, 這樣使得一致性錯誤檢查變得幾乎不可能。 為了完整性我們給出了小段程式碼:

程式碼:

   const char* str_int = "777";
   const char* str_float = "333.3";
   int i = atoi(str_int);
   float f = atof(str_float);

一個更好的辦法:
更有一點複雜, 更遺一致的辦法是利用sscanf()
程式碼:

   const char* str_int = "777";
   const char* str_float = "333.3";
   int i;
   float f;
   if(EOF == sscanf(str_int, "%d", &i)){
      //錯誤
   }
   if(EOF == sscanf(str_float, "%f", &f)){
      //錯誤
   }

Since sscanf() takes a const char* parameter, you can directly use a CString with it:
因為sscanf()用const char* 作為引數, 所以你可以直接用CString作引數:
程式碼:

   CString str_int("777");
   if(EOF == sscanf(str_int, "%d", &i)){
      //error
   }

小心格式描述符(如本例中的"%d")。 sscanf()沒有辦法檢查格式描述符與傳遞變數的型別匹配與否。如果不匹配你將得到不可預期的結果。 同樣注意sscanf()可以一次從字串中提取一個或多個數值。 詳細資訊請查閱MSDN。

C++ 方法
如下的例子展示了利用標準C++類的來完成這個任務的模板函式
程式碼:

#include <string>
#include <sstream>
#include <iostream>
template <class T>
bool from_string(T &t,
                 const std::string &s,
                 std::ios_base & (*f)(std::ios_base&))
{
   std::istringstream iss(s);
   return !(iss>>f>>t).fail();
}
int main()
{
   int i;
   float f;
   // from_string()的第三個引數應為如下中的一個
   // one of std::hex, std::dec 或 std::oct
   if(from_string<int>(i, std::string("ff"), std::hex)){
      std::cout<<i<<std::endl;
   }
   else{
      std::cout<<"from_string failed"<<std::endl;
   }
   if(from_string<float>(f,
                               std::string("123.456"),
                               std::dec))
   {
      std::cout<<f<<std::endl;
   }
   else{
      std::cout<<"from_string failed"<<std::endl;
   }
   return 0;
}

四, int char * float and CString Covernt

1。 int <->CString

  1. int ->CString
int n = 1;
CString str;
str.Format("%d",n);
  1. CString->int
CString str = "1";
int n = atoi(str.GetBuffer(0));
  1. char* 與CString
    1)char*->CString
char sz[128];
CString str;
str.Format("%s",sz);
  1. CString -> char*
CString str;
//int nLength = str.GetLength();
char* sz = str.GetBuffer(0);
  1. float<->CString
    1)float->CString
float f = 0.0;
CString str;
str.Format("%f",f);
  1. CString->float
CString str = "0.0";
float f = atof(str.GetBuffer(0));