关于字符串 && string类

1、 字符串
字符串是存储在内存的连续字节中的一系列字符。

存储在连续字节中的一系列字符意味着可以将字符串存储在char数组中,其中每个字符都位于自己的数组元素中。

什么时候char数组是string类型?
char dog[8]={‘b’,’e’,’a’,’u’,’x’,’’,’I’,’I’}; //not a string
char cat[8]={‘b’,’e’,’a’,’u’,’x’,’’,’I’,’\0’}; //a string
只有第二个数组是字符串。

在cat数组示例中,将数组初始化为字符串的工作看上去冗长乏味——使用了大量的单引号,且必须加上空字符。
有一种更好的初始化字符串的方法——只需使用一个引号括起来的字符串即可。这种字符串被称为字符串常量或者字符串字面值。
char fish[]=”Bubbles”; //结尾有空字符 并且字符数组的长度由编译器数
用引号括起的字符串隐式地包括结尾的空字符,因此不必显示地包括它。

注意:
char boss[8]=”bozo”;
数组boss[4]为空值字符,其是自动加入到结尾
剩余的boss[5]~boss[7]均设置为\0

如果将boss[3]设置为空字符,这使得字符串在第3个字符后即结束,虽然数组中还有其他的字符。

1) 在确定存储字符串所需的最短数组时,别忘了将结尾的空字符计算在内。
2) 字符串常量(使用双引号)不能与字符变量(使用单引号)互换
字符常量(如’S’)是字符串编码的简写表示。在ASCII系统种,’S’只是83的另一种写法。
例如:char shirt_size=’S’;

但是”S”不是字符常量,它表示的是两个字符(字符S和\0)组成的字符串。另外,”S”实际上表示的是字符串所在的内存地址。
下面语句试图将一个内存地址赋给shirt_size,这是错误的!
char shirt_size=”S”; //invalid

2、 拼接字符串常量
C++允许拼接字符串字面值,即将两个用引号括起来的字符串合并为一个。事实上,任何两个由空白(空格、制表符和换行符)分隔的字符串常量都将自动拼接成一个。

cout<<”hello” “world\n”; //helloworld

注意:拼接时不会在被连接的字符串之间添加空格,第二个字符串的第一个字符紧跟第一个字符串的最后一个字符(不考虑\0)后面。
第一个字符串中的’\0’字符将被第二个字符中的第一个字符取代。

3、 在数组中使用字符串
其实主要还是对数组使用字符串初始化
char name[xxx]=”helloworld”;
对与char数组,不是char*,
sizeof()运算符指出整个数组的长度,
但strlen()函数返回的是存储在数组中的字符串的长度;

4、 字符串输入(这个demo是一个单词一个单词读取)
char name[20];
cin>>name;
char dessert[20];
cin>>dessert;

5、 每次读取一行字符串
istream中的类(如cin)提供了一些面向行的类成员函数:getline()和get();
这两个函数都读取一行输入,直到到达换行符;
然而getline()将丢弃换行符,而get()将换行符保留在输入序列中。

1) 面向行的输入:getline()
getline()函数读取整行,它使用回车键输入的换行符来确定输入结尾,可以使用cin.getline(),该函数有两个参数,第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。
例如:
cin.getline(name,20); //参数是20,则函数最多读取19个字符。

getline()成员函数在读取指定数目的字符或遇到换行符停止读取。
例如:
char name[20];
cin.getline(name,20); //这样在name中就可以输入 hello world 按“enter”结束

2) 面向行的输入:get()
get 将换行符留在输入队列中。
cin.get(name,20);
cin.get(dessert,20); //有问题
由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符,因此get()认为已到达行尾,而没有发现任何可读取的内容
如果不借助于帮助,get()将不能跨过该换行符。
幸运的是,get()有另一种变体,使用不带任何参数的cin.get()调用可读取下一个字符(即使是换行符),因此可以用它来处理换行符。

cin.get(name,20);
cin.get(); //接收了换行符
cin.get(dessert,20);

或者采用拼接的方式:

cin.get(name,20).get();
cin.get(dessert,20).get();

6、 string类简介
将字符串作为一种数据类型的表示方法。
string str1;
string str2=”panthers”;

xxxx
cin>>str1;
cout<<str[2]<<endl;

使用string对象的方式与使用字符数组相同
1、 C风格字符串来初始化string对象
2、 使用cin来将键盘输入存储到string对象中
3、 使用cout来显示string对象
4、 使用数组表示法来访问存储在string对象中的字符

string对象和字符数组之间主要区别是:可以将string对象声明为简单变量,而不是数组。
string str1;
string str2=”panthers”;

类设计让程序能够自动处理string大小。例如,str1的声明创建一个长度为0的string对象,但程序将输入读取到str1中时,将自动调整str1的长度。
cin>>str1;
7、 赋值、拼接和附加
使用string类时,某些操作比使用数组更简单。例如,不能将一个数组赋给另一个数组,但可以将一个string对象赋给另一个对象。
char charr1[20];
char charr2[20]=”jaguar”;

string str1;
string str2=”panther”;

charr1=charr2; //invalid
str1=str2;

string类可以使用运算符+将两个string对象合并起来,还可以使用运算符+=将运算符附加到string对象的末尾。
string str3;
str3=str1+str2; //str1和str2和在一起
str1+=str2; /将str2添加到str1的末尾

8、 string类的其他操作
使用函数strcpy()将字符串复制到字符数组中,使用函数strcat()将字符串附加到字符数组末尾。

#include
#include<stdlib.h>
#include
#include
using namespace std;

int main()
{
char charr1[20];
char charr2[20] = “jaguar”;
string str1;
string str2 = “panther”;

//赋值
str1 = str2;
strcpy_s(charr1, charr2);

//拼接
str1 += "paste";
strcat_s(charr1, "juice");

//求长度  使用函数size()或者strlen() 求的字符串的长度都不带空格符
int len1 = str1.size();
int len2 = strlen(charr1);
printf("before len1=%d\n", len1);
printf("before len2=%d\n", len2);

//输出
cout << "The string " << str1 << "\tcontains\t" << len1 << "characters" << endl;
cout << "The string " << charr1 << "\tcontains\t" << len2 << "characters" << endl;

printf("---有意思的地方---------------------\n");
char charr3[20];
string str3;
int len3 = str3.size();  //0
int len4 = strlen(charr3); //29
printf("before len3=%d\n", len3);
printf("before len4=%d\n", len4);

/*
指出数组charr3中的字符串的长度是29??
为什么?
1、首先,数组的内容是未定义的
2、函数strlen()从数组的第一个元素开始计算字节数,直到遇到空字符。
在这个例子中,在数组末尾的几个字节后才遇到空字符。
对于未被初始化的数据,第一个空字符出现的位置是随机的
*/
getchar();
return 1;

}
/*
rst:
before len1=12
before len2=11
The string pantherpaste contains 12characters
The string jaguarjuice contains 11characters
*/

//C++中string、char*、char[]的转换

#include
using namespace std;
int main()
{
//一、string转char*
//1、data()
string str = “hello”;
const char* p = str.data(); //在前面加const
//或者
string str1 = “world”;
char p1 = (char)str1.data();
/说明:
在devC++中,编译需要加const,否则会报错invalid conversion from const char
to char*
这里可以在前面加const 或者使用char*强转
*/

//2、c_str()
//同上 将data()改为c_str();


//二、char*转string  直接赋值
string str2;
char *p2 = "hhh";  //p2就是字符串
str2 = p2;
printf("%s=",str2);  //错误
/*
当声明了string类型变量后,使用printf("%s",s);是会出错的,因为"%s"要求后面对象的首地址,但是string不是这样的
一种类型,因此需要将str2.c_str() 将string转换为char*
*/


//三、string转char[]
//可以知道string的长度,直接一个循环赋值就可以
string pp = "zzzzzzzzz";
char tmpP[20]; //暂时随便定义一个空间大小
int i;
for (i = 0; i < pp.length();i++)
{
	tmpP[i] = pp[i];
}
tmpP[i] = '\0';


getchar();
return 1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值