C++ cstring常用函数

前言

本来不打算使用 c s t r i n g cstring cstring,而转型 C + + S T L C++STL C++STL s t r i n g string string了。但是最近写题 s t r i n g string string超时,思路是没错的。估计 s t r i n g string string确实是在做大量字符串操作时没有字符数组效率高。但是字符数组好久没用,在此复习一下

输入输出

gets(char *s)

读取字符串,当且仅当遇到回车才作为字符串结束符。因此它能接受字符缓冲区的回车,需要注意

char a[30];  //保证大小大于输入长度
int x;
scanf("%d",&x);
getchar();
gets(a);

/*
input:
20
please keep work hard
*/

puts(char *s)

类似 c i n cin cin,直接将字符数组名作为参数输出字符串。但是 p u t s puts puts会自动在最后输出一个回车,有点像 J a v a Java Java p r i n t l n ( ) println() println()

char a[]="please keep work hard";
puts(a);

/*
output:
please keep work hard
*/
mem系列

memset(Type *a,int value,int len)

m e m s e t memset memset本用于给字符串前 l e n len len个字符替换为目标字符,但是作为万能的初始化函数,多用于内存清零。

char s1[]="Happig!"
memset(s1,'?',6);
puts(s1);

/*
output:
??????!
*/

memcpy(Type *a,Type *b,int len)

m e m c p y memcpy memcpy可以用于任何类型数组之间的赋值

int a[5]={1,2,3,4,5};
int b[10];
memcpy(b,a,sizeof a);
for(int i=0;i<5;i++) 
    cout<<b[i]<<" ";
/*
output:
1 2 3 4 5 
*/
字符串功能函数

int strlen(char *s):求字符串长度

计算指定指定字符串 s s s的长度,不包含字符串结束符’\0’,因为字符数组从下标 0 0 0开始,因此数组最大下标为 s t r l e n ( ) − 1 strlen()-1 strlen()1

char s[]="ACM-ICPC";
cout<<strlen(s)<<endl;

/*
output:
8
*/

char *strcpy(char *dest,char *sour):字符串复制

将源字符串 s o u r sour sour复制到目标字符串 d e s t dest dest

char s1[]="Happig!",s2[20];
strcpy(s2,s1);
cout<<s2<<endl;

/*
output:
Happig!
*/

类似的有 s t r n c p y ( c h a r ∗ d e s t , c h a r ∗ s o u r , i n t   l e n ) strncpy(char *dest,char *sour,int~ len) strncpy(chardest,charsour,int len),将源字符串 s o u r sour sour的前 l e n len len个字符复制到目标字符串 d e s des des上,唯一需要注意的是如果复制的长度小于源串长度,需要手动添加’\0’

char s1[]="Happig NP!",s2[20];
//strncpy(s2,s1,10);  //等价于strncpy(s2,s1,sizeof s1);
strncpy(s2,s1,6);
s2[6]='\0';  //不要忘记添加结束符
puts(s2);

/*
output:
Happig
*/

strcat(char *dest,char *sour):字符串拼接函数

s o u r sour sour字符串连接到 d e s t dest dest的尾部,‘\0’也会追加过去

char s1[]="Happig!",s2[]="I'm ";
strcat(s2,s1);
puts(s2);

/*
output:
I'm Happig!
*/

int strcmp(char *s1,char *s2):字符串比较函数

比较字符串 s 1 s_1 s1 s 2 s_2 s2的大小,实际上是一个个字符对比,知道某两个字符不相等或者遇到了某个串的’\0’

如果 s 1 > s 2 s_1>s_2 s1>s2返回 1 1 1,如果 s 1 < s 2 s_1s1<s2返回 − 1 -1 1,相等则返回 0 0 0

char s1[]="AAAApple",s2[]="Battle";
cout<<strcmp(s1,s2)<<endl;

/*
output:
-1
*/

char *strchr(char *s,char c):字符查找函数

在字符串 s s s中查找字符 c c c,如果找到了就返回该字符第一次出现的位置(地址),否则返回 N U L L NULL NULL,因此要注意特判。此外因为字符数组从下标 0 0 0开始存字符串,因此减去首地址得到的是下标,再加一才是第几个字符

char s[]="Happig NP!"
if(strchr(s,'P')!=nullptr){
    int pos1=strchr(s,'P')-s;
	int pos2=strchr(s,'P')-s+1;
	cout<<pos1<<" < "<<pos2<<endl;
}

/*
output:
8 < 9
*/

char *strstr(char *sour,char *dest):子串查找函数

判断字符串 d e s t dest dest是否为字符串 s o u r sour sour的子串,如果是则该函数返回字串在 s o u r sour sour中首次出现的地址,否则返回 N U L L NULL NULL

char s[]="Happig NP!"
if(strstr(s,'NP')!=nullptr){
    int pos=strstr(s,'NP')-s;
	cout<<pos<<endl;
}

/*
output:
7
*/
其他实用函数

int atoi(char *s):字符串转化整型数字

扫描字符串,直到遇到数字或正负号开始做转换,遇到非数字或字符串结束符返回当前值

char a[]="-10086";
cout<<atoi(a)<<endl;

/*
output:
-10086
*/

实际上 s t r i n g s t r e a m stringstream stringstream也能实现该功能

char a[]="-10086";
int x;
stringstream ss(a);
ss>>x;
cout<<x<<endl;

/*
output:
-10086
*/

const char *c_str(string s):string转化为字符数组

c _ s t r ( ) c\_str() c_str()生成一个 c h a r   ∗ char~ * char 常量指针指向字符串的首地址,因此尽量用 s t r c p y strcpy strcpy等函数操作

char s[20];
string s1="Happig?";
strcpy(s,s1.c_str());
puts(s);

/*
output:
Happig?
*/

你可能感兴趣的:(#,C++)