c 语言中的字符串操作

http://blog.chinaunix.net/u1/41817/showart_342390.html

6.5        怎样将字符串打印成指定长度 ?   

 

    如果要按表格形式打印一组字符串,你就需要将字符串打印成指定长度。利用 printf()函数可以很方便地实现这一点,请看下例 :

 

# include <stdio. h>

char * data[25] = {

    "REGION", "--Q1--", "--Q2--", "--Q3--", "--Q4--",

    "North" , "10090. 50" , "12200. 10" , "26653.12" , "62634. 32" ,

    "South", "21662.37", "95843.23", "23788.23", "48279.28",

    "East", "23889.38", "23789.05", "89432.84", "29874.48",

    "West", "85933.82", "74373.23", "78457.23", "28799.84" };

void main (void) ;

void main (void)

{

    int x;

    fox (x = 0, x<25; x+ + )

    {

        if ((x % 5) == 0&&(x !=0))

        printf("/n");

        printf (" %-10. 10s" , data[x]) ;

    }

}

 

    在上例中,字符串数组 char *data[]中包含了某年 4个地区的销售数据。显然,你会要求按表格形式打印这些数据,而不是一个挨一个地毫无格式地打印这些数据。因此,上例中用下述语句来打印这些数据:

    printf("%-10 10s" data[x])

    参数 "%-10 10s"指示 printf()函数按 10个字符的长度打印一个字符串。在缺省情况下, printf()函数按右对齐格式打印字符串,但是,在第一个 10的前面加上减号 (-)后, prinft()函数,就会使字符串左对齐。为此, printf()函数会在字符串的尾部加入空格,以使其长度达到 10个字符。上例的打印输出非常整洁,类似于一张表格,如下所示:

 

    REGION    --Q1--    --Q2--     --Q3--     --Q4--

    North    10090.50   12200.10   26653.12   62634.32

    SOuth    21662.37   95843.23   23788.23   48279.28

    East     23889.38   23789.05   89432.84   29874.48

    West     85933.82   74373.23   78457.23   28799.84

 

    请参见:    

    6 4怎样使字符串右对齐 ?

  

6 6 .怎样拷贝字符串的一部分 ?

 

    利用标准库函数 strncpy(),可以将一字符串的一部分拷贝到另一个字符串中。 strncpy()函数有 3个参数:第一个参数是目录字符串;第二个参数是源字符串;第三个参数是一个整数,代表要从源字符串拷贝到目标字符串中的字符数。以下是一个用 strncpy()函数拷贝字符串的一部分的例子:    

 

# include <stdio. h>

# include <string. h>

 

void main(void);

void main (void)

{

    char * source_str = "THIS IS THE SOURCE STRING" ;

    char dest_strl[40]= {0}, dest_str2[40]= {0};

    / * Use strncpy() to copy only the first 11 characters. * /

    strncpy(dest_strl, source-str, 11);

    printf("How about that! dest-strl is now: '%s'!!!/n", dest-strl);

    / * Now, use strncpy() to copy only the last 13 characters. * /

    strncpy(dest_strl, source_str + (strlen(source_str)-l3) , 13);

    printf("Whoa! dest_str2 is now: '%s'!!!/n". dest_str2);

}

 

    在上例中,第一次调用 strncpy()函数时,它将源字符串的头 11个字符拷贝到 dest_str1中,这是一种相当直接的方法,你可能会经常用到。第二次调用 strncpy()函数时,它将源字符串的最后 13个字符拷贝到 dest_str2中,其实现过程为:

    (1) strlen()函数计算出 source_str字符串的长度,即 strlen(source_str)

    (2) source_str的长度减去 13(13是将要拷贝的字符数 ),得出 source_str中剩余的字符数,即 pstrlen(source_str)-13

    (3) strlen(source_str)-13 source_str的地址相加,得出指向 source_str中倒数第 13个字符的地址的指针,即 source_str+(strlen(source_str)-13)。这个指针就是 strncpy()函数的第二个参数。

    (4) strncpy()函数的第三个参数中指定要拷贝的字符是 13

 

上例的打印输出如下所示:

    How about that! dest_str1 is now 'THIS IS THE'!!!

    Whoa! dest_str2 is now 'SOURCE STRING'!!!

 

    需要注意的是,在将 source_str拷贝到 dest_strl dest_str2之前, dest_strl dest_str2都要被初始化为 null字符 (/0)。这是因为 strncpy()函数在拷贝字符串时不会自动将 null字符添加到目录字符串后面,因此你必须确保在目标字符串的后面加上 null字符,否则会导致打印出一些杂乱无章的字符。

 

    请参见;

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

    6怎样打印字符串的一部分 ?

 

6.6        怎样将数字转换为字符串 ?

 

    C语言提供了几个标准库函数,可以将任意类型 (整型、长整型、浮点型等 )的数字转换为字符串。以下是用 itoa()函数将整数转换为字符串的一个例子:

 

# include <stdio. h>

# include <stdlib. h>

 

void main (void);

void main (void)

{

    int num = 100;

    char str[25];

    itoa(num, str, 10);

    printf("The number 'num' is %d and the string 'str' is %s. /n" ,

                       num, str);

}

 

   itoa()函数有 3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用的基数。在上例中,转换基数为 10

 

    下列函数可以将整数转换为字符串:

----------------------------------------------------------

    函数名                    

----------------------------------------------------------

    itoa()                将整型值转换为字符串

    itoa()                将长整型值转换为字符串

    ultoa()               将无符号长整型值转换为字符串

----------------------------------------------------------

    请注意,上述函数与 ANSI标准是不兼容的。能将整数转换为字符串而且与 ANSI标准兼容的方法是使用 sprintf()函数,请看下例:    

#include<stdio.h> 

# include <stdlib. h>

 

void main (void);

void main (void)

{

    int num = 100;

    char str[25];

    sprintf(str, " %d" , num);

   printf ("The number 'num' is %d and the string 'str' is %s. /n" ,

                          num, str);

 

}

 

    在将浮点型数字转换为字符串时,需要使用另外一组函数。以下是用 fcvt()函数将浮点型值转换为字符串的一个例子:  

 

# include <stdio. h>

# include <stdlib. h>

 

void main (void);

void main (void)

{

    double num = 12345.678;

    char * sir;

    int dec_pl, sign, ndigits = 3; /* Keep 3 digits of precision. * /

    str = fcvt(num, ndigits, &dec-pl, &sign); /* Convert the float

                                                 to a string. * /

    printf("Original number; %f/n" , num) ;  /* Print the original

                                                 floating-point

                                                    value. * /

    printf ("Converted string; %s/n",str);    /* Print the converted

                                                string's value. * /

    printf ("Decimal place: %d/n" , dec-pi) ; /* Print the location of

                                                 the decimal point. * /

    printf ("Sign: %d/n" , sign) ;            /* Print the sign.

                                                 0 = positive,

                                                 1 = negative. * /

}

 

    fcvt()函数和 itoa()函数有数大的差别。 fcvt()函数有 4个参数:第一个参数是要转换的浮点型值;第二个参数是转换结果中十进制小数点右侧的位数;第三个参数是指向一个整数的指针,该整数用来返回转换结果中十进制小数点的位置;第四个参数也是指向一个整数的指针,该整数用来返回转换结果的符号 (0对应于正值, 1对应于负值 )

    需要注意的是, fcvt()函数的转换结果中并不真正包含十进制小数点,为此, fcvt()函数返回在转换结果中十进制小数点应该占据的位置。在上例中,整型变量 dec_pl的结果值为 5,因为在转换结果中十进制小数点应该位于第 5位后面。如果你要求转换结果中包含十进制小数点,你可以使用 gcvt()函数 (见下表 )

 

    下列函数可以将浮点型值转换为字符串:

-------------------------------------------------------------------------

    函数名               

-------------------------------------------------------------------------

    ecvt()    将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点

    fcvt()    以指定位数为转换精度,余同 ecvt()

     gcvt()    将双精度浮点型值转换为字符串,转换结果中包含十进制小数点

-------------------------------------------------------------------------

 

    请参见:

    6怎样将字符串转换为数字 ?

 

6.7        怎样将字符串转换为数字 ?

 

    C语言提供了几个标准库函数,可以将字符串转换为任意类型 (整型、长整型、浮点型等 )的数字。以下是用 atoi()函数将字符串转换为整数的一个例子:

 

# include <stdio. h>

# include <stdlib. h>

 

void main (void) ;

void main (void)

{

    int num;

    char * str = "100";

    num = atoi(str);

    printf("The string 'str' is %s and the number 'num' is %d. /n",

                   str, num);

}

 

   atoi()函数只有一个参数,即要转换为数字的字符串。 atoi()函数的返回值就是转换所得的整型值。    

 

    下列函数可以将字符串转换为数字:

------------------------------------------------------------------------

    函数名      

------------------------------------------------------------------------

  atof()     将字符串转换为双精度浮点型值

  atoi()     将字符串转换为整型值

  atol()     将字符串转换为长整型值

  strtod()   将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字

  strtol()   将字符串转换为长整值,并报告不能被转换的所有剩余数字

  strtoul()  将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字

------------------------------------------------------------------------ 

 

    将字符串转换为数字时可能会导致溢出,如果你使用的是 strtoul()这样的函数,你就能检查这种溢出错误。请看下例:   

# include <stdio. h>

# include <stdlib. h>

# include <limits. h>

 

void main(void);

void main (void)

{

    char* str = "1234567891011121314151617181920" ;

    unsigned long num;

    char * leftover;

    num = strtoul(str, &leftover, 10);

    printf("Original string: %s/n",str);

    printf("Converted number: %1u/n" , num);

    printf("Leftover characters: %s/n" , leftover);

}

 

   在上例中,要转换的字符串太长,超出了无符号长整型值的取值范围,因此, strtoul()函数将返回 ULONG_MAX(4294967295),并使。 char leftover指向字符串中导致溢出的那部分字符;同时, strtoul()函数还将全局变量 errno赋值为 ERANGE,以通知函数的调用者发生了溢出错误。函数 strtod() strtol()处理溢出错误的方式和函数 strtoul()完全相同,你可以从编译程序文档中进一步了解这三个函数的有关细节。

    请参见:

    6 7 怎样将数字转换为字符串

6 9 怎样打印字符串的一部分 ?      

    6 6 中讨论了怎样拷贝字符串的一部分,为了打印字符串的一部分,你可以利用 6 6的例子中的部分技巧,不过你现在要使用的是 printf()函数,而不是 sprintf()函数。请看下例:

 

# include <stdio. h>

# include <stdlib. h>

 

void main (void);

void main (void)

{

    char * source_str = "THIS IS THE SOURCE STRING" ;

    / * Use printfO to print the first 11 characters of source_str. * /

    printf("First 11 characters: ' %11. lls'/n" , source_str);

    / * Use printf() to print only the

        last 13 characters of source _str. * /

    printf("Last 13 characters:'%13.13'/n",

                    source_str+(strlen(source_str)-13))

}

    上例的打印输出如下所示:     

    First 11 characters: 'THIS IS THE'   

    Last 13 characters 'SOURCE STRING'

    在上例中,第一次调用 printf()函数时,通过指定参数 "%11.11s",迫使 printf()函数只打印 11个字符的长度,因为源字符串的长度大于 11个字符,所以在打印时源字符串将被截掉一部分,只有头 11个字符被打印出来。第二次调用 printf()函数时,它将源字符串的最后 13个字符打印出来,其实现过程为:

    (1) strlen()函数计算出 source_str字符串的长度,即 strlen(source_str)

    (2) source_str的长度减去 13(13是将要打印的字符数 ),得出 source_str中剩余字符数,且 pstrlen(source_str)-13

    (3) strlen(source_str)-13 source_str的地址相加,得出指向 source_str中倒数第 13个字符的地址的指针;即 source_str+(strlen(source_str)-13)。这个指针就是 printf()函数的第二个参数。

    (4)通过指定参数“% 13 13s”,迫使 printf()函数只打印 13个字符的长度,其结果实际上就是打印源字符串的最后 13个字符。

 

    请参见:

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

    6 6 怎样拷贝字符串的一部分 ?

 

6 10  怎样判断两个字符串是否相同 ?

 

    C语言提供了几个标准库函数,可以比较两个字符串是否相同。以下是用 strcmp()函数比较字符串的一个例子:

 

#include <stdio. h>

#include <string. h>

 

void main (void);

void main(void)

{

    char* str_1 = "abc" ; char * str_2 = "abc" ; char* str_3 = "ABC" ;

    if (strcmp(str_1, str_2) == 0)

        printf("str_1 is equal to str_2. /n");

    else

        printf("str_1 is not equal to str_2. /n");

    if (strcmp(str_1, str_3) == 0)

       printf("str_1 is equal to str_3 /n");

    else

        printf("str_1 is not equalto str_3 /n")

}

   

    上例的打印输出如下所示:    

    str_1 is equal to str_2.   

    str_1 is not equal to str_3

   

    strcmp()函数有两个参数,即要比较的两个字符串。 strcmp()函数对两个字符串进行大小

写敏感的 (case-sensitiVe)和字典式的 (lexicographic)比较,并返回下列值之一:

----------------------------------------------------

                  

----------------------------------------------------

    <0                第一个字符串小于第二个字符串

     0               两个字符串相等     ·

    >0               第一个字符串大于第二个字符串

----------------------------------------------------

    在上例中,当比较 str_1(即“ abc ) str_2(即“ abc )时, strcmp()函数的返回值为 0。然

而,当比较 str_1( "abc") str_3( "ABC")时, strcmp()函数返回一个大于 0的值,因为按

ASCII顺序字符串“ ABC”小于“ abc”。

    strcmp()函数有许多变体,它们的基本功能是相同的,都是比较两个字符串,但其它地方

稍有差别。下表列出了 C语言提供的与 strcmp()函数类似的一些函数:    

-----------------------------------------------------------------

                            

-----------------------------------------------------------------

    strcmp()         对两个字符串进行大小写敏感的比较

    strcmpi()        对两个字符串进行大小写不敏感的比较

    stricmp()        strcmpi()

    strncmp()        对两个字符串的一部分进行大小写敏感的比较

    strnicmp()       对两个字符串的一部分进行大小写不敏感的比较

-----------------------------------------------------------------

    在前面的例子中,如果用 strcmpi()函数代替 strcmp()函数,则程序将认为字符串“ ABC

等于“ abc”。

 

 


#include <stdio.h>
#include <iostream.h>

void main()
{
 int num=0; 
    for(num=0;num<=158;num++)
 {
  char str1[25];
  if(num<10)
  {  
   sprintf(str1, "000%d-1-100-CAM.bmp",num);
   printf ("the string 'str1' is %s/n",str1);   
  }
  else
   if(num<100)
   {
    sprintf(str1, "00%d-1-100-CAM.bmp", num);
    printf ("the string 'str1' is %s/n",str1); 
   }
   else
    if(num<159)
    {
     sprintf(str1, "0%d-1-100-CAM.bmp",num);
     printf ("the string 'str1' is %s/n",str1);     
    }    
 }
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值