我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++中的字符串(1)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++中的字符串(1)

1、字符串

1.1 字符串定义

字符串就是连续的一连串字符,在C++当中, 处理字符串的方式有两种类型。一种来自于C语言,也被称为C风格字符串。另外一种是基于string类库。

C风格的字符串其实就是字符存储在char数组当中。不过它和一般的数组有一些区别,拥有一些特殊的性质。比如一空字符\0结尾,它的ascii码是0,用来标记字符串的结尾。


char str[5] = {'h', 'e', 'l', 'l', 'o'};
char str2[5] = {'h', 'e', 'l', 'l', '\0'};


对于上面的两个例子,第一个例子虽然也是char数组,但是由于它的结尾不是\0,所以它不能看成是字符串。因为很多算法都是以\0的位置为标记的,比如计算字符串长度的算法,以及cout等等。

上面我们采用的是数组常规的初始化方式,这当然是可以的,不过这样会很不方便。一个是需要一位一位地填写字符,会非常地麻烦。另外还需要手动填充\0,也容易忘记,

所以对于字符串而言我们还有更好的初始化方式:


char hello[6] = "hello";
char world[] = "world";


用引号括起来的字符串隐式地包含了结尾的\0,需要注意的是,我们在确定数组长度的时候需要将结尾的\0也计算在内。

这里要提醒大家注意引号的区别, 在C++当中单引号表示单个字符,而双引号表示字符串。所以下面这种写法是错误的:


char c = "S";


并且“S”其实表示的是字符串所在的内存地址,当我们把一个内存地址赋值给一个char类型的时候自然就会报错了。

咦,不是说好的是字符串么,怎么又扯到地址了?不要急,等后面讲到指针的地方就明白了。

1.2 字符串的读入

直接用字符串常量来初始化字符数组只是一种方式,另外一种常用的方式是只定义字符数组的长度,从外部读入数据,

如:


char str[100];

scanf("%s", str);
cin >> str;

无论是使用scanf还是cin,都是一样的效果。

但是没有这么简单,比如我们再来看一段代码:


char name[100];
char level[100];

scanf("%s", name);
scanf("%s", level);


在这段代码当中,我们定义了name和level两个字符串变量。当我们执行的时候,就会发现问题:

我刚输入完名字,还没来得及输level就结束了。如果我们把namelevel分别输出的话就会发现,name的值是lianglevel的值是tang

这说明了什么?说明了我们读入字符串的时候它并不是按行读入的,而是按照空格分隔的!它不像是隔壁的Pythoninput默认就是读入一行,C++的读入默认都是按照空格分隔的。

那问题来了,假如我们需要读入一行应该怎么办呢?也有办法,我们可以使用cin.getline代替之前的scanf或者是cin

我们来看下它的函数签名:


istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str );


C++允许参数列表不同的同名函数重载,这两个签名都是OK的。两者的差别在于第三个参数,但三个参数表示分隔符,如果不传的话,默认是'\n'。第二个参数表示字符串的长度,所以如果要按照行来读入字符串的话,刚刚的代码应该写成:


cin.getline(name, 100);
cin.getline(level, 100);


除了可以使用getline之外,还可以使用getget有好几种变体,一种变体是读入一个字符,它有一种变体也可以读入一行字符串。不过唯一的区别是,get函数不会处理行尾的换行符。如果我们要读入两行字符的话,需要手动将这个换行符处理掉。


cin.get(name, 100); // 读入一行数据
cin.get();   // 读入换行符
cin.get(level, 100);// 读入第二行数据


写成三行看起来有些繁琐,我们还可以进行简化,简化成一行:


cin.get(name, 100).get().get(level, 100);


看起来很像是Java8的流式编程,能够这样做的原因是getgetline函数会返回一个cin的对象。所以我们可以这样连续调用。

相信有些同学已经注意到了,同样的函数名,根据我们传入的参数不同执行了不同的逻辑。这在C++当中叫做函数重载,是一个非常重要的概念。

1.3 排坑

关于getline有一个比较大的坑,当我们同时使用cingetline的时候,有时候会出现问题。

比如下面这段代码:


int a;
char name[100];
cin >> a;
cin.getline(name, 100);

cout << "a = " << a << endl;
cout << "name = " << name << endl;


这段代码很简单,我们定义了两个变量。一个是int型的a,一个是字符串name。我们使用cin读入a,使用getline读入name

这看起来一点问题也没有,但是当我们运行的时候就会出现问题。

会发现我都没有来得及输入name,程序就结束了,而name读到了一个空。

这并不是C++有bug,而是我们在输入32的时候,敲了一个回车。所以在使用getline读入一行的时候,看到了回车,直接退出了,读入了一个空行,这就是为什么我们没有机会输入name的原因。

要解决这个问题怎么办呢?其实也很简单,我们额外读入一个字符,把换行符给读取掉就行了。


int a;
char name[100];
cin >> a;
cin.get(); // getchar() C语言版本
cin.getline(name, 100);

cout << "a = " << a << endl;
cout << "name = " << name << endl;

类似的问题在竞赛的题目当中很常见,我们经常要同时读入字符串和数字,很容易遇到这样的问题。遇到了不要紧张,仔细检查一下数据和逻辑,看看是不是读入到了换行符。

到此这篇关于C++中的字符串(1)的文章就介绍到这了,更多相关C++字符串内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

注:文章转自微信公众号:Coder梁(ID:Coder_LT)

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++中的字符串(1)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python笔记1-字符串

1、注释单行注释 #多行注释 ’’’ ”””2、操作符标准算术操作符+加 -减 *乘 /除 //地板除 %取模 **乘方标准比较操作符<小于 <=小于等于 >大于 >=大于等于 ==等于 !=不等于逻辑操作符and和 or或者 not
2023-01-31

C++中的数字转字符串to_string

这篇文章主要介绍了C++中的数字转字符串to_string,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

Python -- 操作字符串[1/3]

1,in和not in yuan@ThinkPad-SL510:~$ ipython -nobanner  In [1]: uname = "Linux #50-Ubuntu SMP Fri Mar 18 19:00:26 UTC 2011
2023-01-31

C语言如何计算字符串的 SHA-1 散列

本文讲解了如何使用C语言中的OpenSSL库计算字符串的SHA-1散列值。通过五个步骤,从头文件包含到最终散列值的打印,详细介绍了计算过程。代码示例提供了实际用法,而优点和注意事项部分则提供了额外的见解。
C语言如何计算字符串的 SHA-1 散列
2024-04-02

c#怎么获取字符串中的数字

从 c# 字符串中提取数字的方法有五种:正则表达式、循环和 char.isdigit()、int.tryparse()、string.split() 和 int.parse()、linq。如何从 C# 字符串中提取数字从 C# 字符串中提
c#怎么获取字符串中的数字
2024-05-14

C语言字符串替换:字符,字符串,字符数组详解

在C语言中,字符串是由字符数组表示的。一个字符串是一个以null字符('\0')结尾的字符数组。字符替换:要替换字符串中的某个字符,可以使用循环遍历字符串的每个字符,然后用新的字符替换需要替换的字符。例如,下面的代码将字符串str中的所有字
2023-08-15

C#中字符串怎么用

小编给大家分享一下C#中字符串怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.C#字符串分割string url = "http://asdfsfd as
2023-06-18

c#中如何获取指定字符前的字符串

这篇文章主要介绍了c#中如何获取指定字符前的字符串问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-03

c#中怎么获取指定字符前的字符串

本篇内容主要讲解“c#中怎么获取指定字符前的字符串”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c#中怎么获取指定字符前的字符串”吧!c#获取指定字符前的字符串问题描述Combobox的值为:1
2023-07-05

C#怎么实现字符串包含字符串

本文小编为大家详细介绍“C#怎么实现字符串包含字符串”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么实现字符串包含字符串”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实例using System;name
2023-06-17

c++中字符串怎么输入

c++ 中字符串输入有两种方法:getline 函数,读取整行字符串,包括空格。cin >> 运算符,读取单个单词或以空格分隔的字符串。C++ 中字符串输入在 C++ 中通过 cin 输入字符串有两种方法:1. getline 函数g
c++中字符串怎么输入
2024-05-01

Redis 字符串实现:简单动态字符串-SDS与C字符串的区别

2.1 SDS的定义struct { //buf中已使用的字节数,等于SDS所保存字符串的长度 int len; //buf中未使用的字节长度 int free; //字节数组,用于保存字符串 char[] buf;}2.2
Redis 字符串实现:简单动态字符串-SDS与C字符串的区别
2020-09-07

C#中怎么截取字符串

这篇文章给大家介绍C#中怎么截取字符串,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C#截取字符串应用:C#截取指定长度中英文字符串方法public static string GetFirstString(strin
2023-06-17

c++中如何输入字符串

c++kquote>c++ 输入字符串的方法:1) 直接输入:cin >> str; 2) 指定大小输入:cin.get(str, size); 3) 整行输入:getline(cin, str)。C++ 中如何输入字符串直接输入cin
c++中如何输入字符串
2024-05-06

C#中如何分割字符串

C#中字符串分割提供了多种方法,满足不同需求。String.Split()根据分隔符分隔字符串,可指定分隔符类型。正则表达式提供更复杂的分割模式。LINQ语法可用于查询数据集合并分割字符串。根据具体需求选择合适的方法,例如:简单分隔符:String.Split()复杂模式:正则表达式或LINQ大型字符串:流式传输方法(String.EnumerateLines())
C#中如何分割字符串
2024-04-02

C#中怎么比较字符串

今天小编给大家分享一下C#中怎么比较字符串的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实例using System;nam
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录