1. 程式人生 > >C語言字串操作函式總結

C語言字串操作函式總結

Part 1: Copying

1、函式名: strcpy

: char * strcpy ( char * destination, const char * source );

: 串拷貝(Copies the C string pointed by source into the array pointed by destination, including the terminating null character. To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source

(including the terminating null character), and should not overlap in memory with source.)

程式例:

#include <stdio.h>

#include <string.h>

int main(void)

 {

char string[10];

char *str1 = "abcdefghi";

    strcpy(string, str1);
    printf("%s/n", string);
    return 0;
 } 

2、函式名: strncpy

: char * strncpy ( char * destination, const char * source, size_t num );

: 指定長度的串拷(Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num

characters have been written to it. No null-character is implicitly appended to the end of destination, so destination will only be null-terminated if the length of the C string in source is less than num.)
程式例:

#include <stdio.h>
#include <string.h>

int main ()
{
  char str1[]= "To be or not to be";
  char str2[6];
  strncpy (str2,str1,5);
  str2[5]='/0';//no '/0' will be appendeded to the end of destination automatically
  puts (str2);//
輸出To be
  return 0;
}

另外參考:

void * memcpy ( void * destination, const void * source, size_t num );

void * memmove ( void * destination, const void * source, size_t num );

Part 2: Concatenation

3、函式名: strcat
: 字串拼接函式: char *strcat(char *destin, char *source);
程式例:

#include <string.h>
#include <stdio.h>

int main(void)
{
   char destination[25];
   char *blank = " ", *c = "C++", *Borland = "Borland";

   strcpy(destination, Borland);
   strcat(destination, blank);
   strcat(destination, c);

   printf("%s/n", destination);
   return 0;

另外參考:

char * strncat ( char * destination, char * source, size_t num );

Part 3: Comparison 

4、函式名: strcmp
: 串比較,大小寫敏感: int strcmp(char *str1, char *str2);
比較ASCII碼,str1>str2,返回值 > 0;兩串相等,返回0
程式例:

#include <string.h>
#include <stdio.h>

int main(void)
 {
    char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc";
    int ptr;

    ptr = strcmp(buf2, buf1);
    if (ptr > 0)
       printf("buffer 2 is greater than buffer 1/n");
    else
       printf("buffer 2 is less than buffer 1/n");

    ptr = strcmp(buf2, buf3);
    if (ptr > 0)
       printf("buffer 2 is greater than buffer 3/n");
    else
       printf("buffer 2 is less than buffer 3/n");

    return 0;
 }  

 4.1、函式名: stricmp(還有一種寫法是strcmpiVC 6.0都支援): 以大小寫不敏感方式比較兩個串: int stricmp(char *str1, char *str2);
程式例:

#include <string.h>
#include <stdio.h>

int main(void)
{
   char *buf1 = "BBB", *buf2 = "bbb";
   int ptr;

   ptr = stricmp(buf2, buf1);

   if (ptr > 0)
      printf("buffer 2 is greater than buffer 1/n");

   if (ptr < 0)
      printf("buffer 2 is less than buffer 1/n");

   if (ptr == 0)
      printf("buffer 2 equals buffer 1/n");

   return 0;
}    

5、函式名: strncmp

: 將一個串中的一部分與另一個串比較, 大小寫敏感: int strncmp(char *str1, char *str2, size_t maxlen);
程式例:

#include <string.h>
#include <stdio.h>

int main(void)
{
   char *buf1 = "BBB", *buf2 = "bbb";
   int ptr;

   ptr = strcmpi(buf2, buf1);

   if (ptr > 0)
      printf("buffer 2 is greater than buffer 1/n");

   if (ptr < 0)
      printf("buffer 2 is less than buffer 1/n");

   if (ptr == 0)
      printf("buffer 2 equals buffer 1/n");

   return 0;

5.1、函式名: strncmpi(還有一種寫法是strnicmpVC 6.0都支援): 把串中的一部分與另一串中的一部分比較, 不管大小寫: int strncmpi(char *str1, char *str2);
程式例:

#include <string.h>
#include <stdio.h>

int main(void)
{
   char *buf1 = "BBBccc", *buf2 = "bbbccc";
   int ptr;

   ptr = strncmpi(buf2,buf1,3);

   if (ptr > 0)
      printf("buffer 2 is greater than buffer 1/n");

   if (ptr < 0)
      printf("buffer 2 is less than buffer 1/n");

   if (ptr == 0)
      printf("buffer 2 equals buffer 1/n");

   return 0;

其它參考:

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

int strcoll ( const char * str1, const char * str2 );

size_t strxfrm ( char * destination, const char * source, size_t num );

Part 4: Searching 
6
、函式名: strchr

: char *strchr(char *str, char c);
: 在一個串中查詢給定字元的第一個匹配之處(Locate first occurrence of character in string, Returns a pointer to the first occurrence of character in the C string str. The terminating null-character is considered part of the C string. Therefore, it can also be located to retrieve a pointer to the end of a string.)
程式例:

#include <string.h>
#include <stdio.h>

int main(void)
 {
    char string[15];
    char *ptr, c = 'r';

    strcpy(string, "This is a string");
    ptr = strchr(string, c);
    if (ptr)
       printf("The character %c is at position: %d/n", c, ptr-string);
    else
       printf("The character was not found/n");
    return 0;
 }   
7
、函式名: strcspn

: int strcspn(char *str1, char *str2);
: 在第一個串中查詢包含任何第二個串給定字符集內容的位置(Get span until character in string, Scans str1 for the first occurrence of any of the characters that are part of str2, returning the number of characters of str1 read before this first occurrence. The search includes the terminating null-characters, so the function will return the length of str1 if none of the characters of str2 are found in str1.)
程式例:

#include <stdio.h>
#include <string.h>
#include <alloc.h>

int main(void)
 {
    char *string1 = "1234567890";
    char *string2 = "747D18";
    int length;

    length = strcspn(string1, string2); //length=0, match letter is 1
    printf("Character where strings intersect is at position %d/n", length);

    return 0;
 } 

8、函式名: strspn

: int strspn(char *str1, char *str2);
: 在串中查詢指定字符集出現在串的子集的長度(Get span of character set in string, Returns the length of the initial portion of str1 which consists only of characters that are part of str2)
程式例:

#include <stdio.h>
#include <string.h>
#include <alloc.h>

int main(void)
{
   char *string1 = "1234567890";
   char *string2 = "23DC81";
   int length;

   length = strspn(string1, string2);      //length=3, the initial portion '123' cnsists of characters that are pare of string2

   printf("Character where strings differ is at position %d/n", length);
   return 0;

9、函式名: strpbrk
: 在串中查詢給定字符集中的字元: char *strpbrk(char *str1, char *str2);
程式例:

#include <stdio.h>
#include <string.h>

int main(void)
{
   char *string1 = "abcdefghijklmnopqrstuvwxyz";
   char *string2 = "onm";
   char *ptr;

   ptr = strpbrk(string1, string2);

   if (ptr)
      printf("strpbrk found first character: %c/n", *ptr);
   else
      printf("strpbrk didn't find character in set/n");

   return 0;

10、函式名: strrchr
: 在串中查詢指定字元的最後一個出現: char *strrchr(char *str, char c);
程式例:

#include <string.h>
#include <stdio.h>

int main(void)
{
   char string[15];
   char *ptr, c = 'r';

   strcpy(string, "This is a string");
   ptr = strrchr(string, c);
   if (ptr)
      printf("The character %c is at position: %d/n", c, ptr-string);
   else
      printf("The character was not found/n");
   return 0;

11、函式名: strstr
: char *strstr(char *str1, char *str2);
: 在串中查詢指定字串的第一次出現(Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1. The matching process does not include the terminating null-characters.)
程式例:

#include <stdio.h>
#include <string.h>

int main(void)
{
   char *str1 = "Borland International", *str2 = "nation", *ptr;

   ptr = strstr(str1, str2); //ptr="national", 即該函式將匹配字串的首地址返回
   printf("The substring is: %s/n", ptr);
   return 0;

12、函式名: strtok

: char *strtok(char *str1, char *str2);
: 查詢由在第二個串中指定的分界符分隔開的單詞(A sequence of calls to this function split str into tokens, which are sequences of contiguous characters separated by any of the characters that are part of delimiters.
On a first call, the function expects a C string as argument for str, whose first character is used as the starting location to scan for tokens. In subsequent calls, the function expects a null pointer and uses the position right after the end of last token as the new starting location for scanning.
To determine the beginning and the end of a token, the function first scans from the starting location for the first character not contained in delimiters (which becomes the beginning of the token). And then scans starting from this beginning of the token for the first character contained in delimiters, which becomes the end of the token.
This end of the token is automatically replaced by a null-character by the function, and the beginning of the token is returned by the function.
Once the terminating null character of str has been found in a call to strtok, all subsequent calls to this function with a null pointer as the first argument return a null pointer.)
程式例:

#include <string.h>
#include <stdio.h>

int main(void)
{
   char input[16] = "abc,d";
   char *p;

   /* strtok places a NULL terminator
   in front of the token, if found */
   p = strtok(input, ",");
   if (p)   printf("%s/n", p);    //
輸出abc

   /* A second 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);   //
輸出d
   return 0;

 

其它參考:

const void * memchr ( const void * ptr, int value, size_t num );
        void * memchr (       void * ptr, int value, size_t num );


Part 5: Other

13、函式名: strerror
: 返回指向錯誤資訊字串的指標: char *strerror(int errnum);
程式例:

#include <stdio.h>
#include <errno.h>

int main(void)
{
   char *buffer;
   buffer = strerror(errno);
   printf("Error: %s/n", buffer);
   return 0;

其它參考:

void * memset ( void * ptr, int value, size_t num );

size_t strlen ( const char * str );

Part 6:

14、函式名: strrev
: 串倒轉: char *strrev(char *str);
程式例:

#include <string.h>
#include <stdio.h>

int main(void)
{
   char *forward = "string";

   printf("Before strrev(): %s/n", forward);
   strrev(forward);
   printf("After strrev():  %s/n", forward);
   return 0;

15、函式名: strset
: 將一個串中的所有字元都設為指定字元: char *strset(char *str, char c);
程式例:

#include <stdio.h>
#include <string.h>

int main(void)
{
   char string[10] = "123456789";
   char symbol = 'c';

   printf("Before strset(): %s/n", string);
   strset(string, symbol);
   printf("After strset():  %s/n", string);
   return 0;

16、函式名: strdup
: 將串拷貝到新建的位置處: char *strdup(char *str);
程式例:

#include <stdio.h>
#include <string.h>
#include <alloc.h>

int main(void)
 {
    char *dup_str, *string = "abcde";

    dup_str = strdup(string);
    printf("%s/n", dup_str);
    free(dup_str);

    return 0;
 } 
 17
、函式名: strnset 
功能: 將一個串中的所有字元都設為指定字元: char *strnset(char *str, char ch, unsigned n);
程式例:

#include <stdio.h>
#include <string.h>

int main(void)
{
   char *string = "abcdefghijklmnopqrstuvwxyz";
   char letter = 'x';

   printf("string before strnset: %s/n", string);
   strnset(string, letter, 13);
   printf("string after  strnset: %s/n", string);

   return 0;

18
、函式名: strtod 

: 將字串轉換為double型值: double strtod(char *str, char **endptr);
程式例:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char input[80], *endptr;
   double value;

   printf("Enter a floating point number:");
   gets(input);
   value = strtod(input, &endptr);
   printf("The string is %s the number is %lf/n", input, value);
   return 0;

19、函式名: strtol
: 將串轉換為長整數: long strtol(char *str, char **endptr, int base);
程式例:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
   char *string = "87654321", *endptr;
   long lnumber;

   /* strtol converts string to long integer  */
   lnumber = strtol(string, &endptr, 10);
   printf("string = %s  long = %ld/n", string, lnumber);

   return 0;

20
、函式名: strupr
: 將串中的小寫字母轉換為大寫字母: char *strupr(char *str);
程式例:

#include <stdio.h>
#include <string.h>

int main(void)
{
   char *string = "abcdefghijklmnopqrstuvwxyz", *ptr;

   /* converts string to upper case characters */
   ptr = strupr(string);
   printf("%s/n", ptr);
   return 0;

21
、函式名: swab
: 交換位元組: void swab (char *from, char *to, int nbytes);
程式例:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char source[15] = "rFna koBlrna d";
char target[15];

int main(void)
{
   swab(source, target, strlen(source));
   printf("This is target: %s/n", target);
   return 0;
}