(四十六)字符串

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

并且,因为是内存中的连续字节中的一系列字符。意味着可以将字符串存储在char数组中(因为字符是被存储为char类型的,又因为是连续的,可以认为是若干char类型 所组成的数组)。

每个字符都位于自己的数组的元素中——即每一个字符对应char数组中的一个值。

字符串提供了一种存储文本信息的便捷方式,如提供给用户的消息(“比如说你看到的这一句话”)或者用户的响应(“我打了一些字给电脑”)——用户打的字,输入到字符串char 字符串名[长度+1],或者string类型的变量之中,或者类似的,并非能储存到每个类型之中(比如int类型就不行,因为输出的时候cout要根据类型来决定如何输出储存在内存中的值)。

字符串需要以空字符结尾,写作\0,其ASCII码为0,用于标记字符串的结尾。如果没有以空字符结尾的话,是不行的。——因为可能会显示更多的(不在字符串内容中)的字符。

而且,字符串需要用char的数组。

上代码:

#include<iostream>
int main()
{
	using namespace std;
	char a[5] = { 'a','b','c','d','\0' };	//C-风格的字符串的结尾需要为\0
	cout << a << endl;
	char b[5] = { "abcd" };	//另一种方式,直接用引号将字符串括在里面,并且注意,括在里面的字符应比字符串位数少一(因为要给最后的空字符留位)
	cout << b << endl;	//打印字符串b
	cout << b[0] << endl;	//打印字符串b中的第一个字符
	char c[] = { "I love you" };	//第三种方式,不需要注明字符串的长度,有编译器自动完成。注意,长度为字符串长度+1(最后一位要有空字符)
	cout << "打印字符串C: " << c << endl;
	cout << "字符串C的第一个字符是:" << c[0] << "字符串C的第三个字符是:" << c[2] << endl;
	system("pause");
	return 0;
}

输出结果为:

abcd
abcd
a
打印字符串C: I love you
字符串C的第一个字符是:I字符串C的第三个字符是:l

需要注意的是,让数组的长度不能小于字符串的长度(需要计算最少长度,记得加1因为空字符)。

数组的长度可以大于字符串的长度,数组的长度大于字符串的长度,实际上只是多占了内存空间。也可以让编译器自己计算字符串的长度,这样比自己计算更为安全。

注意:千万不要忘了结尾一定要有空字符,并且要算入数组的元素之一。

 

另外,需要区分字符常量(如'a')和字符串常量(如"a")之间的区别。前者实际上是'a'的数值编码,在ASCII中,编码为97。而"a"实际上是一个有两个元素的数组,第一个元素是字母a,第二个元素为空字符,数组为{'a','\0'}。

 

 

将字符串输入到数组中的方法:

①数组在声明的时候,进行初始化,初始化为字符串常量;

②通过例如cin语句,将用户输入的读入到数组中。

 

上代码:

#include <iostream>
#include <cstring>	//可以使用标准C语言库函数strlen()来确认字符串的长度(不包含空字符)

int main()
{
	using namespace std;
	const int a = 15;
	char aa[a];		//声明数组aa,数组元素为15个元素(因为常量a=15)
	char bb[a] = { "my name is: " };	//声明数组bb,数组元素为15个元素,其中前几个元素分别为m,y,空格,n,a,m,e,空格,i,s,空格。后面为空字符
	cout << "What is your name?" << endl;
	cout << bb;	//打印数组bb,即my name is: (冒号后有个空格)
	cin >> aa;	//用户输入自己的名字,并将字符串输入到数组aa
	cout << "Now, I know your name is " << aa << " ." << endl;
	cout << "你名字的长度为:" << strlen(aa) << "个字。" << endl;	//strlen(数组名)可以显示数组的长度,不包括空字符。
	cout << "你名字所使用的字符串aa的占用" << sizeof(aa) << "个字节(bytes)\n";	//sizeof(数组名)可以显示数组占用的字节数,包括空字符。
	aa[1] = '\0';	//将字符串aa(存储用户输入名字)的第二个字符设置为空字符
	cout << "你名字首字母为:" << aa << endl;	//因为cout语句输出到空字符后停止
	system("pause");
	return 0;
}

输出结果1:

What is your name?
my name is: human
Now, I know your name is human .
你名字的长度为:5个字。
你名字所使用的字符串aa的占用15个字节(bytes)
你名字首字母为:h

输出结果2:(和上面输入的不同)

What is your name?
my name is: 王冬
Now, I know your name is 王冬 .
你名字的长度为:4个字。
你名字所使用的字符串aa的占用15个字节(bytes)
你名字首字母为:

可以发现,由于数组二输入的为汉字,一个汉字占用2个字节。所以显示的名字产长度为4个字(准确说应该是4个字节),又因为第一个字为王(占用两个字节),所以显示首字母(只显示一个字节)便无法显示了。

 

但是,由于cin的机理,在读取用户输入的时候,他不会对空格,tab,或者换行符进行响应(读取到以上三个情况后,自动停止读取),假如我输入的是“王 冬”,cin则只能读取“王”,而把冬丢弃掉。在遇见英文名的时候,这种情况将极为突出。(因为英文名中,姓和名中间有空格)

 

因此,我们需要采用getline()或者get()来读取一行。

其中,getline()将读取到换行符位置,通过确认回车输入的换行符来确定输入的结尾,并将换行符丢弃(即不会读取换行符),而get()读取到换行符为止,并储存换行符。

 

具体在(四十七)中说明

时间: 2024-10-29 21:36:59

(四十六)字符串的相关文章

动物精灵四十六倍密码

动物精灵四十六倍密码一.40 31版面的时候40的共压127, 31的共压17 二.(A)46 28版面46的共压221,28压26, (B)46 25那个版面46的共压193,25的共压261三.3个熊猫共压52,猴子共压24四.第4步熊猫共压99,猴子共压49 五.熊猫共压99.猴子共压93 六.进红色出狮子[全国最大的游戏机破解生产基地]  详情请咨询:  www.shangfen78.cn手机:13067092687   QQ:454386200 

Ruby on rails开发从头来(四十六)- ActiveRecord基础(SQL和Active Record)

想象一下Active Record是如何处理SQL的,我们来看看find方法的:conditions参数,调用的时候像这样:find(:all,:conditions=>-),这里的:conditions参数决定了find方法将返回哪些记录,它相当于Sql语句的where部分,例如,要获取所有的名字为Dave,pay_type为po的订单,我们这样写: pos = Order.find(:all,:conditions => "name = 'dave' and pay_type =

GOLIVE5.0教程(四十六)

教程 4.7 添加日期与时间标志 在GoLive 5中,若要在当前Web页面中添加日期与时间标志,需要按下列步骤进行操作. 步骤一.参见图4-30,书写好相关文本后创建一个空白Text Frame,然后在Objects面板中单击Smart(漂亮的)标签. 图4-30 单击这张标签 步骤二.从Smart标签中将Modified Date(修改日期)图标拖至空白Text Frame中,参见图4-31,结果如图4-32所示. 图4-32 将Modified Date图标拖至此处

ASP 3.0高级编程(四十六)

编程|高级 表10-5 支持数据绑定的HTML元素HTML元素 绑定属性 可否更新数据 可否表格绑定 可否作为HTML显示 A href 不可 不可 不可 APPLET PARAM 可以 不可 不可 BUTTON innerText和innerHTML 不可 不可 可以 DIV innerText和innerHTML 不可 不可 可以 FRAME src 不可 不可 不可 IFRAME src 不可 不可 不可 IMG src 不可 不可 不可 INPUT checked 可以 不可 不可 TY

开发者论坛一周精粹(第十六期):阿里云全球十四个节点评测分析及服务器地域选择攻略

第十六期(2017年7月24日-2017年7月30日 ) 随着阿里云的不断发展,本来首页关于数据中心的图片上只有几个点,而到了现在在海内外均已经部署了非常多的数据中心了,导致小编我为了整理这篇文章,真的是苦不堪言,怎么会那么多数据中心呢! 那么问题又来了,那么多数据中心到底有什么区别?应该如何考虑数据中心的选择?怎么买最优惠? 阿里云全球十四个节点评测分析及服务器地域选择攻略 https://bbs.aliyun.com/read/322581.html 未实名的.com/.net域名即将被暂停

entity-这段代码中二,四,八分频和十六分频有什么意思?

问题描述 这段代码中二,四,八分频和十六分频有什么意思? LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY LED IS PORT (clk,rst:IN std_logic; inp: in std_logic_vector(1 downto 0); output : OUT std_logic_vector(7 downto 0) ); END LED; ARCHITECTUR

十六 Pseudo Elements 伪元素

伪元素吸附在选择上和pseudo classes伪类很像,像这样selector:pseudoelement{property: value;}.有四种方式. First letters and First lines 首字母和首行 first-letter伪元素作用到元素的第一个字母,first-line作用到元素的顶行.你可以,例如为段落创建一个drop caps和首行加粗. p:first-letter {font-size: 3em;float: left;}p:first-line {

热点推荐:PHP中十六个魔术方法详解

前言 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对象中调用一个不可访问方法时调用 __callStatic(),用静态方式中调用一个不可访问方法时调用 __get(),获得一个类的成员变量时调用 __set(),设置一个类的成员变量时调用 __isset(),当对不可访问属性调用isset()或emp

PHP之十六个魔术方法详解

前言 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对象中调用一个不可访问方法时调用 __callStatic(),用静态方式中调用一个不可访问方法时调用 __get(),获得一个类的成员变量时调用 __set(),设置一个类的成员变量时调用 __isset(),当对不可访问属性调用isset()或emp