`
阿尔萨斯
  • 浏览: 4169529 次
社区版块
存档分类
最新评论

c++ 字符串操作

 
阅读更多

对于字符串,有char *和string

当以以下这种方式声明char* 指针时,“ aafwwafa ”是一个const char*类型,所以初始化得到的char*指针不能修改其值,为常量。

char *ch="awfawfawf";

string str="awfawff';
    const char *ch=str.c_str();//这种格式得到的也是应该const char*类型数据,这里
input=str.data();//这样都是获得const char*

若以其他地址来初始化指针时,是可以进行修改的。

将char*转换为string类型就比较简单

string str(input);
	str=input;

string(char *)

将char*类型的字符串转换为string。



<string.h>中的c类型也就是char*字符串的各种操作函数:

strcpy

extern char *strcpy(char* dest, const char *src);

进行字符串的复制。

函数原型为,

 char* strcpy(char *d, const char *s)
 {
   char *r=d;
   while((*d++=*s++));
   return r;
 }









strcat

extern char *strcat(char *dest,char *src);

进行字符串合并

函数原型为

//将源字符串加const,表明其为输入参数
char*strcat(char* strDest,const char*s trSrc)
{
//后文returnaddress,故不能放在assert断言之后声明address
char* address=strDest;
assert((strDest!=NULL)&&(strSrc!=NULL));//对源地址和目的地址加非0断言
while(*strDest)//是while(*strDest!=’\0’)的简化形式
{
//若使用while(*strDest++),则会出错,因为循环结束后strDest还会执行一次++,
//那么strDest将指向'\0'的下一个位置。/所以要在循环体内++;因为要是*strDest最后指
//向该字符串的结束标志’\0’。
strDest++;
}
 
while(*strDest++=*strSrc++)
{
NULL;//该循环条件内可以用++,
}//此处可以加语句*strDest=’\0’;无必要
return address;//为了实现链式操作,将目的地址返回
}


strcat_s更加安全。


strtok

char *strtok(char s[], const char *delim);

分解字符串为一组字符串。s为要分解的字符串,delim为分割字符串。

例如:strtok("abc,def,ghi",","),最后可以分割成为abc def ghi.尤其在点分十进制的IP中提取应用较多。

在c++中使用

strtok_s(char s[],const char *delim,char* p);p为暂时保存分割后的字符串的地方。




int strlen(char*)获得字符串长度。


int memcmp(const void *buf1, const void *buf2, unsigned int count);

对字符串进行比较,count为比较的位数,但是这里不是char类型的指针,则当count大于字符串的长度时,函数仍然继续比较之后的储存单元中的内容。比较过程是比较ASCII码值,则当buf1的一个元素的值小于buf2的对应位置时,返回小于0的值,值为两者此字符的差,而且函数就此返回,不继续比较。同理,buf1大于buf2时,返回大于0的int,当相等时,返回0.


extern int strncmp(const char *s1,const char * s2,unsigned int count);

同之前的对字符串进行比较函数memcmp,但是,这里使用char类型指针,则会当字符串到达末尾时,停止比较。


extern int strcmp(const char *s1,const char * s2);

同上进行字符串比较的函数,但是没有位数限制,而是完全比较整个字符串。函数大致如下:

int strcmp(const char*str1,const char*str2)
{
while(*str1==*str2)
{
if(*str1=='\0')
return 0;
str1++;
str2++;
}
return *str1-*str2;
}

extern char *strchr(const char *s,char c);查找字符串s中首次出现字符c的位置

返回的是查找到的字符的地址。当不存在时,返回NULL。

extern char *strstr(const char *str1, const char *str2);该函数返回str2第一次在str1中的位置,如果没有找到,返回NULL



<stdio.h>中对char*字符串的输入输出操作。

sprintf(char *buff,const char *format,argument])

将 数据 按照format规定的格式,输入到字符串buff中。

“%d"整数转换为10进制 "%%" 输出%号 %c转换为ascii编码 %f浮点数 %0 8进制整数 %s 转换为字符串 %x 16进制,小写 %X 16进制大写

"%I64d"//转换64位int,即当使用long long时,必须要用%I64d来进行输出才能得到正确的结果。

使用”%016I64x"来输出以16进制来输出64的long long,其中,0表示空位补0,16表示最多16位。I64x表示16进制的64位int。

c中输出小数

一。%nf 即输出的数字占n位 当原数字位数大于n时原样输出,原数字位数小于n时输出数字左端补上空格,比如原数字为a=1.23456;n为4时输出为1.23456,n为9时输出为
(空格空格1.23456)
二。%n.mf 即输出总共占n位其中有m位小数 如a=1.23456 用%4.2f输出为1.23如果用
%5,1f输出为123.4即长度为5小数为1!这里也有当原数字长度小于n时左端补空格这个规则!
还有就是当n前面有个负号时即%-nf或%-n.mf时就右端补空格!

c++中输出固定位数的小数时。

cout.precision(n);按照n位有效数字或小数为进行输出。

cout.setf(cout.showpoint);设置始终显示小数点后数字,如3,输出3.0000

cout.setf(ios::fixed);使其为n位小数 进行输出。


c++中使用sprintf_s(char* , int ,...)其中增加了第二个参数,设置一个缓冲区的大小,避免溢出。


printf(" 格式 “,数据)

将数据按照固定格式要求进行输出。


scanf(" 格式 ",数据)

将数据输入按照固定的格式进行读取保存。

c++中使用scanf_s,且使用引用或者指针进行输入。因为这是一个函数,要实现写入,必须有改实参的值。

scanf_s("%fmm %fmm %fpx",&d[0],&d[1],&d[2]);



atoi :字符串转int: int n = atoi(char *c);

char* itoa(int value,char *string,int radix);
int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等


c类字符串操作函数:

void *memccpy (void *dest, const void *src, int c, size_t n);
从src所指向的对象复制n个字符到dest所指向的对象中。如果复制过程中遇到了字符c则停止复制,返回指针指向dest中字符c的下一个位置;否则返回NULL。
void *memcpy (void *dest, const void *src, size_t n);
从src所指向的对象复制n个字符到dest所指向的对象中。返回指针为dest的值。
void *memchr (const void *s, int c, size_t n);
在s所指向的对象的前n个字符中搜索字符c。如果搜索到,返回指针指向字符c第一次出现的位置;否则返回NULL。
int memcmp (const void *s1, const void *s2, size_t n);
比较s1所指向的对象和s2所指向的对象的前n个字符。返回值是s1与s2第一个不同的字符差值。
int memicmp (const void *s1, const void *s2, size_t n);
比较s1所指向的对象和s2所指向的对象的前n个字符,忽略大小写。返回值是s1与s2第一个不同的字符差值。
void *memmove (void *dest, const void *src, size_t n);
从src所指向的对象复制n个字符到dest所指向的对象中。返回指针为dest的值。不会发生内存重叠。
void *memset (void *s, int c, size_t n);
设置s所指向的对象的前n个字符为字符c。返回指针为s的值。
char *stpcpy (char *dest, const char *src);
复制字符串src到dest中。返回指针为dest + len(src)的值。
char *strcat (char *dest, const char *src);
将字符串src添加到dest尾部。返回指针为dest的值。
char *strchr (const char *s, int c);
在字符串s中搜索字符c。如果搜索到,返回指针指向字符c第一次出现的位置;否则返回NULL。
int strcmp (const char *s1, const char *s2);
比较字符串s1和字符串s2。返回值是s1与s2第一个不同的字符差值。
int stricmp (const char *s1, const char *s2);
比较字符串s1和字符串s2,忽略大小写。返回值是s1与s2第一个不同的字符差值。
size_t strcspn (const char *s1, const char *s2);
返回值是字符串s1的完全由不包含在字符串s2中的字符组成的初始串长度。
size_t strspn (const char *s1, const char *s2);
返回值是字符串s1的完全由包含在字符串s2中的字符组成的初始串长度。
char *strdup (const char *s);
得到一个字符串s的复制。返回指针指向复制后的字符串的首地址。
char *strerror(int errnum);
返回指针指向由errnum所关联的出错消息字符串的首地址。errnum的宏定义见errno.h。
size_t strlen (const char *s);
返回值是字符串s的长度。不包括结束符'/0'。
char *strlwr (char *s);
将字符串s全部转换成小写。返回指针为s的值。
char *strupr (char *s);
将字符串s全部转换成大写。返回指针为s的值。
char *strncat (char *dest, const char *src, size_t maxlen);
将字符串src添加到dest尾部,最多添加maxlen个字符。返回指针为dest的值。
int strncmp (const char *s1, const char *s2, size_t maxlen);
比较字符串s1和字符串s2,最多比较maxlen个字符。返回值是s1与s2第一个不同的字符差值。
char *strncpy (char *dest, const char *src, size_t maxlen);
复制字符串src到dest中,最多复制maxlen个字符。返回指针为dest的值。
int strnicmp(const char *s1, const char *s2, size_t maxlen);
比较字符串s1和字符串s2,忽略大小写,最多比较maxlen个字符。返回值是s1与s2第个不同的字符差值。
char *strnset (char *s, int ch, size_t n);
设置字符串s中的前n个字符全为字符c。返回指针为s的值。
char *strset (char *s, int ch);
设置字符串s中的字符全为字符c。返回指针为s的值。
char *strpbrk (const char *s1, const char *s2);
返回指针指向字符串s1中字符串s2的任意字符第一次出现的位置;如果未出现返回NULL。
char *strrchr (const char *s, int c);
在字符串s中搜索字符c。如果搜索到,返回指针指向字符c最后一次出现的位置;否则返回NULL。
char *strrev (char *s);
将字符串全部翻转,返回指针指向翻转后的字符串。
char *strstr (const char *s1, const char *s2);
在字符串s1中搜索字符串s2。如果搜索到,返回指针指向字符串s2第一次出现的位置;否则返回NULL。
char *strtok (char *s1, const char *s2);
用字符串s2中的字符做分隔符将字符串s1分割。返回指针指向分割后的字符串。第一次调用后需用NULLL替代s1作为第一个参数。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics