C风格字符串与string

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

C风格字符串 (C-style string)

C风格字符串的特殊性质, 以空字符(\0, ASICC码为0, 实际上是在内存中被设置为0的字节, 在内存中很常见)标记结尾

char one[3] = {'a', 'b', 'c'}; // not a string
printf("%s\n", one); // 使用字符串处理函数例如printf, cout,处理时,会打印3个字符,并接着将内存中之后的字节解释并打印, 直到遇到空字符为止()abc@�*�U

char two[3] = {'a', 'b', '\0'}; // a string
printf("%s\n", two); // 将打印前2个字符,并停止

char three[5] = "abc";	// the \0 is understood
char four[] = "abc";	// let the compiler count
/* 用引号包含的字符串在结尾隐式的包含空字符 */

// 见 C++ primer plus 第6版 --- 字符串
/* 字符串常量(双引号)不能与字符常量(单引号)互换,字符常量(如'S')是字符串编码的简写表示,在ASCII系统中, 'S'只是83的另一种写法,*/
char shirt_size = 'S'; // 将83赋值给shirt_size

/* "S"是字符串常量, 表示两个字符(字符S 和 \0)组成的字符串, 而且,"S"sh实际上表示的是字符串所在内存地址。 */
char shirt_size = "s"; // 试图将一个内存地址赋值给shirt_size
// *** 由于地址在C++中是一种独立的类型,因此C++编译器不允许这种不合理的做法

在确定字符串所需要的最短数组时, 要确保将结尾的空字符计算在内

string类

ISO/ANSI C++98标准通过添加string类扩展了C++库, 可以使用string类型的变量(对象)存储字符串, string类定义隐藏了字符串的数组性质,可以像处理普通变量一样处理字符串

char onechars1[10];
char onechars2[10] = "Hello";
char onechars3[10] = {"Hello"};

string str1;
string str2 = "Hello";
string str3 = {"Hello"};
/*
在很多方面, string对象的方式与使用字符数组相同
+ 可以使用C-风格字符串来初始化string对象
+ 可以使用cin来将键盘输入村初到string对象中
+ 可以使用cout来显示string对象
+ 可以使用数组表示法来访问存储在string对象中的字符
*/
其它形式的字符串

除cahr类型外, 还有类型wchar_t; c++11新增了类型char16_t和char32_t.可创建这些类型的数组和这些类型的字符串字面值

wchar_t title[] = L"Hello World";
char16_t title[] = u"Hello World";
char32_t title[] = U"Hello World";
string I/O 与 char[] I/O

例getline

char chars[10];
string str;

cin >> chars;	// input adfasdfadsfasdfasdfffffffffffffffffffffffffffffffff
/*
---- 见 C++ Primer Plus 第六版 string
数组chars的内容是未定义的, 函数strlen从数组的第一个元素开始计算字节数,直到遇到空字符, 此时在数组末尾的
几个字节后才遇到空字符, 对于未被初始化的数据,第一个空字符的出现位置是随机的。因此在程序运行时,得到的数组
长度很可能与此不同
*/
cout << strlen(chars) << endl;  // 51,

cin >> str;
cin.get();

cin.geline(chars, 10);
getline(cin, str);
sizeof 与 strlen
char one1[8] = "abcde";
char one2[] = "abcde";

cout << sizeof(one1) << endl; // 8 sizeof()指出整个数组的长度
cout << strlen(one1) << endl; // 5 strlen()返回存储在数组中的字符串的长度,只计算可见的字符, 不将空字符计算在内

cout<< sizeof(one2) << endl; // 6
cout << strlen(one2) << endl; // 5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值