c 语言中的字符串操作

本章集中讨论字符串操作,包括拷贝字符串,拷贝字符串的一部分,比较字符串,字符串右对齐,删去字符串前后的空格,转换字符串,等等。C语言提供了许多用来处理字符串的标准库函数,本章将介绍其中的一部分函数。

    在编写C程序时,经常要用到处理字符串的技巧,本章提供的例子将帮助你快速学会一些常用函数的使用方法,其中的许多例子还能有效地帮助你节省编写程序的时间。

 

61 串拷贝(strcpy)和内存拷贝(memcpy)有什么不同?它们适合于在哪种情况下使用?

 

    strcpy()函数只能拷贝字符串。strcpy()函数将源字符串的每个字节拷贝到目录字符串中,当遇到字符串末尾的null字符(/0)时,它会删去该字符,并结束拷贝。

    memcpy()函数可以拷贝任意类型的数据。因为并不是所有的数据都以null字符结束,所以你要为memcpy()函数指定要拷贝的字节数。

      在拷贝字符串时,通常都使用strcpy()函数;在拷贝其它数据(例如结构)时,通常都使用memcpy()函数。

    以下是一个使用strcpy()函数和memcpy()函数的例子:

#include  < stdio. h >

#include 
< string . h >

typedef 
struct  cust - str  {

    
int id ;

    
char last_name [20] ;

    
char first_name[l5];

}
 CUSTREC;

void  main ( void );

void  main ( void )

{

    
char * src_string = "This is the source string" ;

    
char dest_string[50];

    CUSTREC src_cust;

    CUSTREC dest_cust;

    printf(
"Hello! I'm going to copy src_string into dest_string! ");

    
/ * Copy src_ string into dest-string. Notice that the destination

      
string is the first argument. Notice also that the strcpy()

      function returns a pointer to the destination 
string* /

    printf(
"Done! dest_string is: %s " ,

        strcpy(dest_string, src_string)) ;

    printf(
"Encore! Let's copy one CUSTREC to another.  ") ;

    prinft(
"I'll copy src_cust into dest_cust.  ");

    
/ * First, intialize the src_cust data members. * /

    src_cust. id 
= 1 ;

    strcpy(src_cust. last_name, 
"Strahan");

    strcpy(src_cust. first_name, 
"Troy");

    
/ * Now, Use the memcpy() function to copy the src-cust structure to

        the dest_cust structure. Notice that, just 
as with strcpy(), the

        destination comes first. 
* /

    memcpy(
&dest_cust, &src_cust, sizeof(CUSTREC));

    printf(
"Done! I just copied customer number # %d (%s %s). " ,

        dest_cust. id, dest_cust. first_name, dest_cust. last_name) ;

}


6. 2怎样删去字符串尾部的空格?

 

    C语言没有提供可删去字符串尾部空格的标准库函数,但是,编写这样的一个函数是很方便的。请看下例:

#include  < stdio. h >

# include 
< string . h >

 

void  main ( void );

char   *  rtrim( char   *  );

void  main( void )

{

    
char * trail_str = "This string has trailing spaces in it";

   
/ * Show the status of the string before calling the rtrim()

       function. 
* /

    printf(
"Before calling rtrim(), trail_str is '%s' i" , trail_str);

    print (
"and has a length of %d.  " , strlen (trail_str));

   
/ * Call the rtrimO function to remove the trailing blanks. * /

    rtrim(trail_str) ;

   
/ * Show the status of the string

       after calling the rtrim() function. 
* /

    printf(
"After calling rttim(), trail_ str is '%s' ", trail _ str );

    printf (
"and has a length of %d.  " , strlen(trail-str)) ;

}


/   *  The rtrim() function removes trailing spaces from a  string *   / .

 

char   *  rtrim( char   *  str)

{

    
int n = strlen(str)-1/ * Start at the character BEFORE

                               the 
null character (0). * / 

    
while (n>0/ * Make sure we don't go out of hounds. . . * /

    
{

        
if ( * (str + n) 1 =' '/ * If we find a nonspace character: * /

        
{

            
* (str+n+1= '' ; / * Put the null character at one

                                     character past our current

                                     position. 
* /

            
break ; / * Break out of the loop. * /

        }


        
else / * Otherwise , keep moving backward in the string* /.

            n
--;

    }


    
return str;    /*Return a pointer to the string*/

}


在上例中,rtrim()是用户编写的一个函数,它可以删去字符串尾部的空格。函数rtrim()从字符串中位于null字符前的那个字符开始往回检查每个字符,当遇到第一个不是空格的字符时,就将该字符后面的字符替换为null字符。因为在C语言中null字符是字符串的结束标志,所以函数rtrim()的作用实际上就是删去字符串尾部的所有空格。

6.3        怎样删去字符串头部的空格?

 

    C语言没有提供可删去字符串头部空格的标准库函数,但是,编写这样的一个函数是很方便的。请看下例;

#include  < stdio. h >  

#include 
< string . h >

 

void  main( void ); 

char   *   ltrim ( char   *  ) ; 

char   *  rtrim( char   *  ) ;

void  main ( void )

{

    
char * lead_str = " This string has leading spaces in it. " ;,

    
/ * Show the status of the string before calling the Itrim()

        function. 
* /

    printf(
"Before calling Itrim(), lead-str is '%s' ", lead_str);

    printf(
"and has a length of %d.  " , strlen(lead_str));

    
/ * Call the Itrim() function to remove the leading blanks. * /.

        Itrim(lead_str);

    
/ * Show the status of the string

        after calling the Itrim() function. 
* /

    prinft(
"After calling Itrim(), lead_str is '%s' ", lead_str);

    print(
"and has a length of %d.  '' , strlen(lead-str)) ;

}


/   *  The Itrim() function removes leading spaces from a  string *   /

 

char   *  ltrim( char   *  str)

{

    strrev(str) ; 
/ * Call strrevO to reverse the string* /

    rtrim(str)). 
/* Call rtrimO to remvoe the "trailing" spaces.
 * /

    strrev(str); / * Restore the string's original order. * /

    return str ; / * Return a pointer to the string. * /.

}

/ * The rtrim() function removes trailing spaces from a string. * /

 

char* rtrim(char* str)

{

    int n = strlen (str)-l ; / * Start at the character BEFORE

    the null character (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值