一、简单介绍相关问题
声明一下,我们从C风格和C++风格来分类讨论字符串问题。
首先说一说C语言中的字符数组与字符串它们所表现的不同点问题:
char str[7] = {‘n’,’i’,’h’,’a’,’o’}
char str[5] = {‘n’,’i’,’h’,’a’,’o’}
char str[] = {“nihao”}
char str[] = “nihao”
首先看第一行,数组一共是7个字节的空间大小,实际上有意义的只有5个字符,另外两个位置无法确定其值。再看第二行,数组正好就是是5个字节的空间大小,没有后边的多余字符。第三行和第四行其实是等价的,只是写法不同,它们占用的空间是几个字节呢?答案是6个,因为末尾系统自动添加了空字符'/0'。
前两行是纯正的字符数组,而后两行就是C风格的字符串了,即用字符数组表示字符串。另外,也可以通过指针来定义一个字符串,比如:char * pstr = “nihao”。
再来看看C++语言中字符串相关问题。
C++提供了3中表示C风格字符串的方法:字符数组、字符串常量、字符串指针。他们的类型都是char* (char指针),因此被自动作为char*类型参数传递给函数。字符串函数通过检测空值字符来确定字符串的结尾。
在C++中我们可以用C风格的字符串,这个是兼容的,并且在<cstring>库中还提供了很多C风格的字符串操作函数:
字符串复制函数:char *strcpy(char *s,const char ct)
串连接函数:char *strcat(char *s,const char *ct)
字符串比较函数:int strcmp(const char *cs,const char ct)
字符串长度函数:int strlen(const char *s)
除了C风格的字符串,C++还有自己的标准字符串类<string>,比如说string str = “hello”,对应的也提供了很多操作string的函数
另外,注意一下下边这个:
char name1[20] = "DreamerWay";
cout<<sizeof(name1)<<endl;
cout<<strlen(name1)<<endl;
第一个输出是20而第二个输出是10,也就是说sizeof输出的数组所占空间大小而strlen输出的是数组中存储的字符串的长度。
二、应用(主要针对C风格的字符数组、字符串)
1、字符指针作为函数的形参
void (char *from, char *to)
{
for(; *form != '\0'; from++, to++)
*to = *from;
*to = '\0';
}
2、字符数组作为函数的形参
void copy_string(char from[], char to[])
{
int i=0;
while(from[i] != '\0')
{ to[i] = from[i]; i++; }
to[i] = '\0';
}
3、字符输入输出
char str[80], *p;
p = gets(str);
puts(p);
puts(str);
4、字符串作为函数形参
void copy_s(char *str1,char *str2)
{
while((*str2=*str1)!='\0')
{
str1++;
str2++;
}
}