用std::string::compare()用法

2023-10-27

c++系列文章目录

c++处理文本相对于python等脚本语言还是挺麻烦的,往往需要和fstream、fstream、string、一起配合使用才能完全把文本解析出来。其实,string并不是一个单独的容器,只是basic_string 模板类的一个typedef 而已,相对应的还有wstring, 你在string 头文件中你会发现下面的代码:
在这里插入图片描述
由于只是解释string的用法,如果没有特殊的说明,本文并不区分string 和 basic_string的区别。

string 其实相当于一个保存字符的序列容器,因此除了有字符串的一些常用操作以外,还有包含了所有的序列容器的操作。字符串的常用操作包括:增加、删除、修改、查找比较、链接、输入、输出等。

场景

  1.std::string 我们经常用来存储字符串数据, 当然它也可以作为byte的存储器,存储任意字节.

  2.通常情况下我们使用 std::string 的 compare 方法比较字符串, 但这个方法比较奥字符串是不可靠的.

说明

1.compare 方法和 strcmp并不相同, 它比较的是 std::string size()大小里的所有字节.在size() 长度范围里, 如果有’\0’字符, 一样进行比较, 所有在不知道 std::string里是否存储纯字符串时, 最好先转换为 const char* (调用c_str()) , 再调用 strcmp比较. 这个坑还是很吓人的.

前言

cplusplus reference

在这里插入图片描述

一、列子

void ModelImporter::parseOBJ(const char* filePath)
{
	float x = 0.f, y = 0.f, z = 0.f;
	string content;
	ifstream fileStream(filePath, ios::in);
	string line = "";

	while (!fileStream.eof())
	{
		getline(fileStream, line);
		if (line.compare(0, 2, "v ") == 0)    //注意v后面有空格
		{
			std::stringstream ss(line.erase(0, 1));
			ss >> x >> y >> z;
			//ss >> x; ss >> y; ss >> z;
			_vertVals.push_back(x);
			_vertVals.push_back(y);
			_vertVals.push_back(z);
		}
		if (line.compare(0, 2, "vt") == 0)
		{
			std::stringstream ss(line.erase(0, 2));
			ss >> x >> y;
			_stVals.push_back(x);
			_stVals.push_back(y);
		}
		if (line.compare(0, 2, "vn") == 0)
		{
			std::stringstream ss(line.erase(0, 2));
			ss >> x >> y >> z;
			_normalVals.push_back(x);
			_normalVals.push_back(y);
			_normalVals.push_back(z);
		}
		if (line.compare(0, 2, "f") == 0)
		{
			string oneCorner, v, t, n;
			std::stringstream ss(line.erase(0, 2));
			for (int i = 0; i < 3; i++)
			{
				getline(ss, oneCorner, ' ');
				//getline(ss, oneCorner, " ");
				stringstream oneCornerSS(oneCorner);
				getline(oneCornerSS, v, '/');
				getline(oneCornerSS, t, '/');
				getline(oneCornerSS, n, '/');

				int vertRef = (stoi(v) - 1) * 3;   //为什么要 -1?
				int tcRef = (stoi(t) - 1) * 2;
				int normRef = (stoi(n) - 1) * 3;

				_triangleVerts.push_back(_vertVals[vertRef]);
				_triangleVerts.push_back(_vertVals[vertRef + 1]);
				_triangleVerts.push_back(_vertVals[vertRef + 2]);

				_textureCoords.push_back(_stVals[tcRef]);
				_textureCoords.push_back(_stVals[tcRef + 1]);

				_normals.push_back(_normalVals[normRef]);
				_normals.push_back(_normalVals[normRef + 1]);
				_normals.push_back(_normalVals[normRef + 2]);
			}
			 
		}
	}
}
#include <iostream>
#include <string>
 
int main ()
{
  std::string str1 ("green apple");
  std::string str2 ("red apple");
 
  if (str1.compare(str2) != 0)
    std::cout << str1 << " is not " << str2 << '\n';
 
  if (str1.compare(6,5,"apple") == 0)//第一个参数表示str1中的位置:str1[6],第二个参数表示要比较的字符串的最大数量,即从指定位置开始后的比较数目
    std::cout << "still, " << str1 << " is an apple\n";
 
  if (str2.compare(str2.size()-5,5,"apple") == 0)//同上
    std::cout << "and " << str2 << " is also an apple\n";
 
  if (str1.compare(6,5,str2,4,5) == 0)//str1中的“apple”和str2中的“apple”比较
    std::cout << "therefore, both are apples\n";
 
  return 0;
}

二、运行结果

green apple is not red apple
still, green apple is an apple
and red apple is also an apple
therefore, both are apples

总结

注意:比较的结果不一定为1,0,-1,可能出现+2、-2等情况,当为正数时表示str1大于str2,为零时相等,为负数时小于str2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用std::string::compare()用法 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 使用PostMan测试接口的时候如何在Header中添加token验证

    前提 由于业务要求 每次接口请求都是post方式 且头部需要在自定义字段中定义token字段 做法 在Authorization中添加APIKey 然后添加token和token的值 因为这里只是简单的开发个测试接口 所以不能通过登录验证去
  • #Java 拆分数字123456为[1,2,3,4,5,6]

    原题目 有int num 123456 如何在不转字符串并且不使用split 方法的情况下将其拆分为 1 2 3 4 5 6 解答 int num 1233456 int fac 10 算术因子 ArrayList
  • $.ajax()post方式请求参数无法传递,request.getParameter()无法获取

    ajax post方式请求参数无法传递 request getParameter 无法获取 在前台页面中 ajax url ctx rediscluster delete do data rname rname type post data
  • vue使用高德地图报错:AMap.DistrictSearch is not a constructor问题解决

    这个问题说的 是没有初始化 解决如下 参考 https blog csdn net shidaping article details 78537730
  • 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.

    问题 from flask restful reqparse 自定义的help内容无法显示 代码如下 from flask restful import reqparse class EquipmentStaticView views Me
  • Unity Android手机触屏事件

    一 下面先说经常用的三个事件 手指按下 手指移动 手指松开 1 手指按下 if input touchCount 1 if input touches 0 phase TouchPhase Beagn 手指按下时 要触发的代码 2 手指在屏
  • 监控系统 服务器配置,监控系统服务器配置

    监控系统服务器配置 内容精选 换一换 简要介绍Mesos是一个集群管理器 提供了有效的 跨分布式应用或框架的资源隔离和共享 可以管理Hadoop MPI Hypertable Spark等集群 语言 C C 一句话描述 集群管理器开源协议
  • docker 报错 Container is not running

    我在运行docker exec it 56b90db5253e bin bash报错 出现这个问题 是因为Container容器之前已经启动过了 需要执行docker start 56b90db5253e就可以解决了
  • 转:前端 100 问:能搞懂80%的请把简历给我

    前端 100 问 能搞懂80 的请把简历给我 引言 半年时间 几千人参与 精选大厂前端面试高频 100 题 这就是 壹题 在 2019 年 1 月 21 日这天 壹题 项目正式开始 在这之后每个工作日都会出一道高频面试题 主要涵盖阿里 腾讯
  • 【工具】谷歌浏览器禁用JS

    操作 F12 进入调试窗口 ctrl shift p 调出命令行工具 输入 disable javascript 选中后回车执行 反之 enable javascript 启用JS 或者直接关闭调试窗口 好处 绕开JS校验 可以直接复制代码
  • java导入csv格式文件之身份证格式处理

    一 出现的问题 csv中的身份证号如下图 导到数据库中的结果 因此怎样导入才能使身份证能够正常导入呢 2 解决方案 第一步 选中身份证那一列 第二步 右键选择 设置单元格格式 第三步 数字列中 选择 特殊 gt 邮政编码 点击确定
  • MySql基础教程(二):数据类型

    MySql基础教程 二 数据类型 MySQL 中定义数据字段的类型对你数据库的优化是非常重要的 MySQL 支持多种类型 大致可以分为三类 数值 日期 时间和字符串 字符 类型 数值类型 MySQL 支持所有标准 SQL 数值数据类型 这些
  • 【C++11】随机数引擎与随机数类

    文章目录 随机数引擎与伪随机数 获取 真随机数 静态随机数引擎 随机数种子 std random device 服从均匀分布的整型随机数 服从均匀分布的实型随机数 服从标准正态分布的随机数 服从二项分布的随机结果 随机数引擎与伪随机数 C
  • 【CSDN竞赛】第八期解题报告

    文章目录 感想 关于自己 关于平台 第一题 难度 入门但是不完全入门 题目描述 90分做法 100分做法 第二题 难度 中等 题目描述 100分做法 第三题 难度 简单 中等 题目描述 100分做法 第四题 难度 中等 题目描述 100分做
  • 使用Qt开发俄罗斯方块游戏(1)

    使用Qt开发俄罗斯方块游戏 可能大家都比较感兴趣吧 那么就快看下面的详细讲解吧 其实在Qt Creator中已经有了俄罗斯方块的例子 大家可以在帮助中搜索Tetrix进行查看 其内容如下 但是对于初学者 这个例子并不是那么容易就能看懂 所以
  • 【图卷积神经网络】1-入门篇:为什么使用图神经网络(下)

    为什么使用图神经网络 在本书中 我们将重点介绍图学习技术中的深度学习家族 通常称为图神经网络 GNNs是一种新的深度学习架构类别 专门设计用于处理图结构化数据 与主要用于文本和图像的传统深度学习算法不同 GNNs明确地用于处理和分析图数据集
  • CSS中line-height属性

    line height CSS 属性用于设置多行元素的空间量 如多行文本的间距 对于块级元素 它指定元素行盒 line boxes 的最小高度 对于非替代的 inline 元素 它用于计算行盒 line box 的高度 CSS Demo l
  • Latex中插入多张图片,实现并排排列或者多行多列排列

    最近需要用latex插入多张图片 达到这么一个效果 但是我原来只插入过一张图片 图片内容来源于网络 是国漫一人之下的宝儿姐 强推这部国漫 代码如下 效果如图 begin figure centering includegraphics he
  • yolov3训练讯飞安检图像数据集记录

    yolov3训练讯飞安检图像数据集记录 前言 前置工作 数据集 yolov3配置 下载yolov3项目代码 修改Makefile文件并编译 实验 准备数据集 下载Imagenet上预先训练的权重 修改darknet cfg voc data
  • 用std::string::compare()用法

    c 系列文章目录 c 处理文本相对于python等脚本语言还是挺麻烦的 往往需要和fstream fstream string 一起配合使用才能完全把文本解析出来 其实 string并不是一个单独的容器 只是basic string 模板类