Chinaunix首页 | 论坛 | 博客
  • 博客访问: 445944
  • 博文数量: 155
  • 博客积分: 786
  • 博客等级: 军士长
  • 技术积分: 1561
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-01 23:37
个人简介

在路上

文章分类

全部博文(155)

文章存档

2016年(2)

2015年(36)

2014年(45)

2013年(34)

2012年(38)

我的朋友

分类: 嵌入式

2014-05-19 20:01:18

string.h中的常见函数

       

 1、函数名称:   strcpy
函数原型:   char* strcpy(char* str1,char* str2);
函数功能:   str2指向的字符串拷贝到str1中去
函数返回:   返回str1,即指向str1的指针
参数说明:
所属文件:  

#include
#include
int main()
{
  char string[10];
  char *str1="abcdefghi";
  strcpy(string,str1);
  printf("the string is:%s\n",string);
  return 0;

2、函数名称:   strcat
函数原型:   char* strcat(char * str1,char * str2);
函数功能:   把字符串str2接到str1后面,str1最后的'\0'被取消
函数返回:   str1
参数说明:
所属文件:  

#include
#include

int main()
{
  char buffer[80];

  strcpy(buffer,"Hello ");
  strcat(buffer,"world");
  printf("%s\n",buffer);
  return 0;
}

3、函数名称:   strcmp
函数原型:   int strcmp(char * str1,char * str2);
函数功能:   比较两个字符串str1,str2.
函数返回:   str1返回负数; str1=str2,返回 0; str1>str2,返回正数.
参数说明:
所属文件:  

#include
#include
int main()
{
  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、函数名称:   strchr
函数原型:   char* strchr(char* str,char ch);
函数功能:   找出str指向的字符串中第一次出现字符ch的位置
函数返回:   返回指向该位置的指针,如找不到,则返回空指针
参数说明:   str-待搜索的字符串,ch-查找的字符
所属文件:  

#include
#include
int main()
{
  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;
}

5、函数名称:   strstr
函数原型:   char* strstr(char* str1,char* str2);
函数功能:   找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)
函数返回:   返回该位置的指针,如找不到,返回空指针
参数说明:
所属文件:  

#include
#include
int main()
{
  char *str1="Open Watcom C/C++",*str2="Watcom",*ptr;
  ptr=strstr(str1,str2);
  printf("The substring is:%s\n",ptr);
  return 0;
}

6、函数名称:   strrev
函数原型:   char *strrev(char *s)
函数功能:   将字符串中的所有字符颠倒次序排列
函数返回:   指向s的指针
参数说明:
所属文件:  

#include
#include
int main()
{
  char *forward="string";
  printf("Before strrev():%s",forward);
  strrev(forward);
  printf("After strrev(): %s",forward);
  return 0;
}

7、函数名称:   strupr
函数原型:   char *strupr(char *s)
函数功能:   将字符串s中的字符变为大写
函数返回:
参数说明:
所属文件:  

#include
#include
int main()
{
  char *string="abcdefghijklmnopqrstuvwxyz",*ptr;
  ptr=strupr(string);
  printf("%s",ptr);
  return 0;
}

8、函数名称:   strlwr
函数原型:   char *strlwr(char *s)
函数功能:   将字符串中的字符变为小写字符
函数返回:   指向s的指针
参数说明:
所属文件:  

#include
int main()
{
  char str[]="HOW TO SAY?";
  printf("%s",strlwr(str));
  return 0;
}

9、函数名称:   strlen
函数原型:   unsigned int strlen(char * str);
函数功能:   统计字符串str中字符的个数(不包括终止符'\0')
函数返回:   返回字符串的长度.
参数说明:
所属文件:  

#include
#include
int main()
{
  char str[]="how are you!";
  printf("the lence is:%d\n",strlen(str));
  return 0;
}

10、函数名称:   memcpy
函数原型:   void *memcpy(void *dest, const void *src, size_t n)
函数功能:   字符串拷贝
函数返回:   指向dest的指针
参数说明:   src-源字符串,n-拷贝的最大长度
所属文件:   ,

#include
#include
int main()
{
  char src[]="******************************";
  char dest[]="abcdefghijlkmnopqrstuvwxyz0123456709";
  char *ptr;
  printf("destination before memcpy:%s\n",dest);
  ptr=memcpy(dest,src,strlen(src));
  if (ptr)
    printf("destination after memcpy:%s\n",dest);
  else
    printf("memcpy failed");
  return 0;
}

11、函数名称:   memset
函数原型:   void *memset(void *s, int c, size_t n)
函数功能:   字符串中的n个字节内容设置为c
函数返回:
参数说明:   s-要设置的字符串,c-设置的内容,n-长度
所属文件:   ,

#include
#include
#include
int main()
{
  char buffer[]="Hello world";
  printf("Buffer before memset:%s\n",buffer);
  memset(buffer,'*',strlen(buffer)-1);
  printf("Buffer after memset:%s",buffer);
  return 0;
}

 

sprintf用法

        在将各种类型的数据构造成字符串时,由于sprintf printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。sprintf printf 有用得多。

sprintf 定义如下:
      int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:格式化字符串上。
     printf
sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。

格式化数字字符串sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代itoa

//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //
产生"123"
可以指定宽度,不足的左边补空格:
sprintf(s, "%8d%8d", 123, 4567); //
产生:"     123    4567"
当然也可以左对齐:
sprintf(s, "%-8d%8d", 123, 4567); //
产生:"123     4567    "
也可以按照16 进制打印:
sprintf(s, "%8x", 4567); //
小写16 进制,宽度占8 个位置,右对齐
sprintf(s, "%-8X", 4568); //
大写16 进制,宽度占8 个位置,左对齐

这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。
sprintf(s, "%08X", 4567); //
产生:"000011D7"
上面以”%d”进行的10 进制打印同样也可以使用这种左边补0 的方式。

连接字符串
sprintf
的格式控制串中既然可以插入各种东西,并最终把它们连成一串,自然也就能够连接字符串,从而在许多场合可以替代strcat,但sprintf 能够一次连接多个字符串(自然也可以同时在它们中间插入别的内容,总之非常灵活)。

printf/sprintf 函数的返回值,但有时它却是有用的,spritnf 返回了本次函数调用最终打印到字符缓冲区中的字符数目。也就是说每当一次sprinf 调用结束以后,你无须再调用一次strlen 便已经知道了结果字符串的长度。如:
int len = sprintf(s, "%d", i);

三、 sscanf函数的用法

 #include

int main()
{
    const char* s = "";
    char buf[20];

    sscanf( s, "%*[^/]/%[^@]", buf );
    printf( "%s ", buf );

    return 0;
}

结果为:12DDWDFF      

    sscanfscanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

函数原型:int scanf(char *buffer, const char * format [,argument]... );
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | ' ' | %符号},注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d

width:宽度,一般可以忽略

用法如:

const char sourceStr[] = "hello, world";

char buf[10] = {0};

sscanf(sourceStr, "%5s", buf);   //%5s,只取5个字符

cout << buf<< endl;

结果为:hello

{h | l | I64 | L}:参数的size,通常h表示单字节sizeI表示2字节 size,L表示4字节size(double例外),l64表示8字节size

type :这就很多了,就是%s,%d之类。

特别的:

%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:

const char sourceStr[] = "hello, world";

char buf[10] = {0};

sscanf(sourceStr, "%*s%s", buf);   //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

cout << buf<< endl;

结果为:world

注:

1 * 亦可用于格式中, ( %*d %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)

2{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d

3width表示读取宽度。

4{h | l | I64 | L}:参数的size,通常h表示单字节sizeI表示2字节 size,L表示4字节size(double例外),l64表示8字节size
5
type :这就很多了,就是%s,%d之类。

6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值


支持集合操作:

     %[a-z] 表示匹配az中任意字符,贪婪性(尽可能多的匹配)

     %[aB'] 匹配aB'中一员,贪婪性

     %[^a] 匹配非a的任意字符,贪婪性

1. 常见用法。

        char buf[512] = {0};   

        sscanf("123456 ", "%s", buf);

       printf("%s ", buf);

结果为:123456

2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

      sscanf("123456 ", "%4s", buf);printf("%s ", buf);

结果为:1234

3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

      sscanf("123456 abcdedf", "%[^ ]", buf);

       printf("%s ", buf);

结果为:123456

4.  取仅包含指定字符集的字符串。如在下例中,取仅包含19和小写字母的字符串。

      sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);

       printf("%s ", buf);

结果为:123456abcdedf

5.  取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

      sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);

       printf("%s ", buf);

结果为:123456abcdedf

6、给定一个字符串iios/12DDWDFF@122,获取 / @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf

       sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);

       printf("%s ", buf);

结果为:12DDWDFF

7、给定一个字符串“hello, world”,仅保留world。(注意:之后有一空格)

       sscanf(“hello, world”, "%*s%s", buf);  

       printf("%s ", buf);

结果为:world

%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了如果没有空格则结果为NULL

 

 

阅读(3188) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~