本来不打算使用 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
*/
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(char∗dest,char∗sour,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_1
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?
*/