Sweety

Practice makes perfect

导航

字符串库函数

Posted on 2014-07-20 17:40  蓝空  阅读(297)  评论(0编辑  收藏  举报

(一)string定义:

a) string s;//生成一个空字符串s

stringa="eholldfs";a="dfgdfg";cin>>a;

b) string s(str)  //拷贝构造函数生成str的复制品

c) string s(str,n) //将字符串str"始于位置n"的部分当作字符串的初值  n为下标

d) string s(str,n,strlen)   //将字符串str"始于n且长度顶多strlen"的部分作为字符串的初值

e) string s(ch)  //C字符串作为s的初值  ch为char[]类型

f) string s(ch,chars_len)   //将ch字符串前chars_len个字符作为字符串s的初值。  ch为char类型

g) string s(num,c)   //生成一个字符串,包含numc字符

h) string s(beg,end)   //以区间beg;end(不包含end)内的字符作为字符串s的初值(暂不清楚具体用法)

i)    s.~string() //销毁所有字符,释放内存

(二)string函数:

1、string类型与int类型转换

(1).string类型 int

         number = atoi( st.c_str() );

(2).int char[]

函数名称: itoa
函数原型
: char *itoa(int value,char *string,int radix)
函数功能: 将整形数value转换为其等价的字符串

函数返回: 指向string的指针
参数说明: value-要转化的数值,radix-转换的进制,如10表示按十进制转换
 
所属文件
: <stdlib.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
  int number=123456L;
  char string[25];
  ltoa(number,string,10);
  printf("integer=%ld string=%s",number,string);
  return 0;
}

PS:itoa函数
itoa为c语言的一个函数。itoa函数是一个广泛应用的,从非标准扩展到标准的C语言。它不能被移植,因为它不是标准定义下的C语言,但是,编译器通常在一个不遵循程式标准的模式下允许其通过header<stdlib.h> ,因为它是一个从逻辑对应到标准库的函数。itoa取整数输入值,并将其转换为数字的基数。

编辑本段原型
    char *itoa(int value, char *string,int radix);
  原型说明:  value:欲转换的数据。 string:目标字符串的地址。radix:转换后的进制数,可以是10进制、16进制等。

功 能: 把一整数转换为字符串

具体用法

  itoa(i,num,10);
    i ----需要转换成字符串的数字
    num---- 转换后保存字符串的变量
    10---- 转换数字的基数(即进制)。10就是说按10进制转换数字。还可以是2,8,16等等你喜欢的进制类型

  返回值:指向num这个字符串的指针

程序实例:

  #include <stdlib.h>
  #include <stdio.h>
  int main(void)
  { 
  int number = 12345;
  char string[25];
  itoa(number, string, 10);
  printf("integer = %d string = %s\n", number, string);
  return 0;
  } 

注意事项:

  itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用的基数(进制)。在上例中,转换基数为10,就意味着以10为转换进制。10:十进制;2:二进制...

  itoa并不是一个标准的C函数,它是Windows特有的,如果要写跨平台的程序,请用sprintf。是Windows平台下扩展的,标准库中有sprintf,功能比这个更强,用法跟printf类似:

  char str[255];
    sprintf(str, "%x", 100); //将100转为16进制表示的字符串。

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

    编辑本段数字转化为字符串函数名及功能   (后两个未通过验证)

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

 

2.string char数组

string str = "abcd";

char ch[10];
strcpy(ch, str.c_str());

3. char数组 string

  char ch[]= "Hellow";或者char *ch = "Hello";

   string str(ch);

这里在补充一下另外一个字符数组间的复制,注意其特点,运用恰当了在替换字符串一部分时还挺好用的:

void *memcpy(void *dest, const void *src, int n);
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
#include <string.h>
函数返回一个指向dest的指针。
1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。   
2.与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。   
3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。   
//注意,source和destin都不一定是数组,任意的可读写的空间均可。

程序例
example1  作用:将s中的字符串复制到字符数组d中。   // memcpy.c   
#include <stdio.h>   
#include <string.h>   
int main()   
{
  char *s="Golden Global View";
   char d[20];
  clrscr();
  memcpy(d,s,strlen(s));
  d[strlen(s)]='\0'; //因为从d[0]开始复制,总长度为strlen(s),d[strlen(s)]置为结束符
   printf("%s",d);
   getchar();
  return 0;   
}   输出结果:Golden Global View
example2  作用:将s中第14个字符开始的4个连续字符复制到d中。(从0开始)  
#include <string.h>   
int main()   
{
  char *s="Golden Global View";
  char d[20];
   memcpy(d,s+14,4); //从第14个字符(V)开始复制,连续复制4个字符(View)   //memcpy(d,s+14*sizeof(char),4*sizeof(char));也可
  d[4]='\0';
   printf("%s",d);
  getchar();
  return 0;   
}   输出结果: View
example3  作用:复制后覆盖原有部分数据   
#include <stdio.h>   
#include <string.h>   
int main(void)   
{
   char src[] = "******************************";
  char dest[] = "abcdefghijlkmnopqrstuvwxyz0123as6";
  printf("destination before memcpy: %s\n", dest);
  memcpy(dest, src, strlen(src));
  printf("destination after memcpy: %s\n", dest);
  return 0;   
}   
输出结果:   destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6
                    destination after memcpy: ******************************as6

5.拷贝

     a=b;

6.字符串长度

   len = str.length();              len = str.size();

7.字符串比较

  直接比较 >  >=   <   <=   ==   !=

   str1.compare(str2);

   str1.compare(pos1,len1,str2,pos2,len2);值为负,0,正。nops长度到完。

8.附加

   str1 += str2;  从做题经验来看,尽量这样写,这样 的比str=str+"123";效率要明显高

9.字符串提取

    str2 = str1.substr(pos1,len1);

10.字符串搜索

   where = str1.find(str2);              返回所查找的第一个字符串的下标,没有返回的是-1,str2是空字符返回0

  where = str1.find(str2,pos1);    pos1是从str1的第几位开始。

  where = str1.rfind(str2);           从后往前搜。

11.插入字符串

   str1.insert(pos1,str2);                 在pos所在下标之前插入

  str1.insert(pos1,str2,pos2,len2);    pos1为插入的起始地址(下标),插入到该地址之前,str2为要插入的字符串,pos2为子串的起始位置,len2为str2的最大

                                                        长度

  str1.insert(pos1,num,char);    num是插入次数,char是要插入的字符。

12.替换字符串 

   str.replace(pos, 1, ""); 分别为开始位置,长度,要替换的字符串

/*用法一:
 *用str替换指定字符串从起始位置pos开始长度为len的字符

 *string& replace (size_t pos, size_t len, const string& str);
 */

int main()
{
    string line = "this@ is@ a test string!";
    <span style="color:#006600;"><strong> line.replace(line.find("@"), 1, "");</strong></span>    //从第一个@位置替换第一个@为空
    cout << line << endl;    
    return 0;
}

详细用法 网址 :http://blog.csdn.net/glp_hit/article/details/8815509

13.删除字符串

  str.erase(n1,n2) ;//分别为起始位置,并且包含这两个位置,n1可以等与n2

   str.clear();

14.颠倒字符串
    reverse(str.begin(),str.end()); 

15.交换字符串

  swap(str1,str2);

#include<algorithm> 

main()

{

     int n;

     cin>>n;

     string a[999]={""};//字符串数组,多个字符串

     for(int i=0;i<=n-1;i++)

 cin>>a[i];

     sort(a,a+n);//排序,数组名,数组长度

     for(int i=n-1;i>=0;i--)

    cout<<a[i];

}

(三)char[]处理:

函数名: strcat

功能:字符串拼接函数

用法: char *strcat(char *destin, char *source);

 

函数名: strchr

功能:在一个串中查找给定字符的第一个匹配之处\

用法: char *strchr(char *str, char c);

 

函数名: strcmp

功能:串比较

用法: int strcmp(char *str1, char *str2);

Asic码,str1>str2,返回值 > 0;两串相等,返回0

 

函数名: strncmpi

功能:将一个串中的一部分与另一个串比较,不管大小写

用法: int strncmpi(char *str1, char *str2, unsigned maxlen);

 

函数名: strcpy

功能:串拷贝

用法: char *strcpy(char *str1, char *str2);

 

函数名: strcspn

功能:在串中查找第一个给定字符集内容的段

用法: int strcspn(char *str1, char *str2);

 

函数名: strdup

功能:将串拷贝到新建的位置处

用法: char *strdup(char *str);

 

函数名: stricmp

功能:以大小写不敏感方式比较两个串

用法: int stricmp(char *str1, char *str2);

 

函数名: strerror

功能:返回指向错误信息字符串的指针

用法: char *strerror(int errnum);

 

函数名: strcmpi

功能:将一个串与另一个比较,不管大小写

用法: int strcmpi(char *str1, char *str2);

 

函数名: strncmp

功能:串比较

用法: int strncmp(char *str1, char *str2, int maxlen);

 

函数名: strncmpi

功能:把串中的一部分与另一串中的一部分比较,不管大小写

用法: int strncmpi(char *str1, char *str2);

 

函数名: strncpy

功能:串拷贝

用法: char *strncpy(char *destin, char *source, int maxlen);

 

函数名: strnicmp

功能:不注重大小写地比较两个串

用法: int strnicmp(char *str1, char *str2, unsigned maxlen);

 

函数名: strnset

功能:将一个串中的所有字符都设为指定字符

用法: char *strnset(char *str, char ch, unsigned n);

 

函数名: strpbrk

功能:在串中查找给定字符集中的字符

用法: char *strpbrk(char *str1, char *str2);

 

函数名: strrchr

功能:在串中查找指定字符的最后一个出现

用法: char *strrchr(char *str, char c);

 

函数名: strrev

功能:串倒转

用法: char *strrev(char *str);

 

函数名: strset

功能:将一个串中的所有字符都设为指定字符

用法: char *strset(char *str, char c);

 

函数名: strspn

功能:在串中查找指定字符集的子集的第一次出现

用法: int strspn(char *str1, char *str2);

 

函数名: strstr

功能:在串中查找指定字符串的第一次出现

用法: char *strstr(char *str1, char *str2);

 

函数名: strtod

功能:将字符串转换为double型值

用法: double strtod(char *str, char **endptr);

 

函数名: strtok

功能:查找由在第二个串中指定的分界符分隔开的单词

用法: char *strtok(char *str1, char *str2);

 

函数名: strtol

功能:将串转换为长整数

用法: long strtol(char *str, char **endptr, int base);

 

函数名: strupr

功能:将串中的小写字母转换为大写字母

用法: char *strupr(char *str);


函数名: swab

功能:交换字节

用法: void swab (char *from, char *to, int nbytes);


(四)部分函数的详细介绍:

gets函数
格式:gets(字符数组)
功能:从终端输入一个字符串到字符数组,并且得到一个函数值,该函数值是字符数组的起始地址。
读入全部字符(包括空格),直到遇到回车符为止【这是它与getchar()的重要区别,getch(),getchar()都是接收一个字符的命令,但实现上有区别;getch从键盘上读入一个数据,不给回显,不需要回车确认,按下键就实现了函数。(经常写在函数尾,作为暂停,以便用户看清程序结果)getchar()从输入输出流中读一个字符的ASCII码。因此输入时需要以回车来确认输入,而且有回显。还有记录功能

例如:
char c[13];

gets (c);
puts函数【与gets()相对】
格式:puts(字符数组)
功能:用来输出一个字符串到终端,它的作用与printf("%s",字符串)相同,但puts函数一次只能输出一个字符串,而printf函数一次可以输出多个字符串。另外,用puts函数输出时,将’\0’字符转换成换行符,因而puts函数一次输出一行,不必另外加换行符。
使用gets和puts函数,必须在程序的开头使用预处理命令:
#include "stdio.h"

strcat函数
格式:strcat(字符数组1,字符数组2)
功能:连接两个字符数组中的字符串,把字符串2连接到字符串1的后面,结果放在字符数组1中。例如:
strcat(str1,str2);
将str2中的字符连接到str1的字符后面,并在最后加一个’\0’。连接后新的字符串存放在str1中,因此字符数组str1必须定义得足够大,以便容纳连接后的新字符串。函数调用后得到一个函数值—str1的地址。

strcpy函数,是复制,会覆盖掉原来的,想连接用strcat。
格式:strcpy(字符数组1,字符串2)
功能:该函数是字符串拷贝函数,用来将一个字符串复制到一个字符数组中。例如:strcpy (str1,"china"); 作用是将”China"这个字符串拷贝到str1数组中。
说明:
.字符数组必须定义得足够大,以便容纳被拷贝的字符串。
.拷贝时连同字符串后面的'\0'一起拷贝到字符数组中去。
.strcpy函数中,第一个参数必须写成数组名形式(如str1),第二个参数可以是字符数组名,也可以是一个字符串常量,如strcpy(str1,str2)或strcpy(str1,"China")。
.不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。如下面是不合法的,而只能用strcpy函数处理。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。
str1={"China"};
str1=str2;
.可以用strcpy(str1,str2,n)将str2中前面n个字符拷贝到str1中去,然后再加’\0’。

strcmp函数
格式:strcmp(字符串1,字符串2
功能:该函数的作用是比较字符串1和字符串2。字符串比较的规则与其它语言中相同,即对两个字符串自左向右逐个字符相比(按ASCⅡ码值大小比较),直到出现不同的字符或遇到’\0’为止。如全部字符相同,则记为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。比较的结果由函数值带回。
(1)字符串1=字符串2,函数值为0。
(2)如果字符串1>字符串2,函数值为一正整数。
(3)如果字符串1<字符串2,函数值为一负整数。
说明:
对两个字符串比较,用以下方式是不合法的:
if(str1==str2) printf("yes");
而只能用
if(strcmp(str1,str2)==0) printf("yes");

strlen函数
格式:strlen(字符数组)
功能:该函数的作用是测试字符串的长度,返回值为字符串的实际长度【不算\0】。例如:
strlen(“Computer”);
函数值为8。

strlwr函数
格式:strlwr(字符串)
功能:该函数的作用是将字符串中大写字母转换成小写字母。

strupr函数
格式:strupr(字符串)
功能:其作用是将字符串中的小写字母转换成大写字母。


 

(五)string其他:

string类的替换函数:

string &replace(int p0, int n0,const char *s);//删除从p0开始的n0个字符,然后在p0处插入串s

string &replace(int p0, int n0,const char *s, int n);//删除p0开始的n0个字符,然后在p0处插入字符串s的前n个字 

string &replace(int p0, int n0,const string &s);//删除从p0开始的n0个字符,然后在p0处插入串s

string &replace(int p0, int n0,const string &s, int pos, int n);//删除p0开始的n0个字符,然后在p0处插入串s中从pos开始的n个字符 

string &replace(int p0, int n0,int n, char c);//删除p0开始的n0个字符,然后在p0处插入n个字符c

string &replace(iterator first0, iterator last0,const char *s);//[first0last0)之间的部分替换为字符串s

string &replace(iterator first0, iterator last0,const char *s, int n);//[first0last0)之间的部分替换为s的前n个字符

string &replace(iterator first0, iterator last0,const string &s);//[first0last0)之间的部分替换为串s

string &replace(iterator first0, iterator last0,int n, char c);//[first0last0)之间的部分替换为n个字符c

string &replace(iterator first0, iterator last0,const_iterator first, const_iteratorlast);//[first0last0)之间的部分替换成[firstlast)之间的字符串string类的插入函:

string &insert(int p0, const char *s);

string &insert(int p0, const char *s, int n);

string &insert(int p0,const string &s);

string &insert(int p0,const string &s, int pos, int n);

//4个函数在p0位置插入字符串spos开始的前n个字符

string &insert(int p0, int n, char c);//此函数在p0处插入n个字符c

iterator insert(iterator it, char c);//it处插入字符c,返回插入后迭代器的位置

void insert(iterator it, const_iterator first, const_iterator last);//it处插入[firstlast)之间的字符

void insert(iterator it, int n, char c);//it处插入n个字符c

 

string类的迭代器处理: 

string类提供了向前和向后遍历的迭代器iterator,迭代器提供了访问各个字符的语法,类似于指针操作,迭代器不检查范围。 

string::iteratorstring::const_iterator声明迭代器变量,const_iterator不允许改变迭代的内容。常用迭代器函数有:

const_iterator begin()const;

iterator begin();                //返回string的起始位置 

const_iterator end()const;

iterator end();                    //返回string的最后一个字符后面的位置

const_iterator rbegin()const;

iterator rbegin();                //返回string的最后一个字符的位置

const_iterator rend()const;

iterator rend();                    //返回string第一个字符位置的前面rbeginrend用于从后向前的迭代访问,通过设置迭代器

string::reverse_iterator,string::const_reverse_iterator实现

 

字符串流处理:

通过定义ostringstreamistringstream变量实现,<sstream>头文件中

例如:

    string input("hello,this is a test");

    istringstream is(input);

    string s1,s2,s3,s4;

    is>>s1>>s2>>s3>>s4;//s1="hello,this",s2="is",s3="a",s4="test" 

    ostringstream os;

    os<<s1<<s2<<s3<<s4;

    cout<<os.str();