stdstring 相关问题

std :: string是C ++标准库的基于字节的“字符串”类型,在<string>标头中定义。

从 gdb 设置 std::string 变量值?

当调试器在断点处停止时,是否可以修改 std::string 变量的值,而无需采取诸如调整当前缓冲区的内存映像之类的黑客手段? 例如。一些...

回答 1 投票 0

我可以将结构传递给`std::format`吗?

我有这个结构,我需要传递给 std::format: #包括 #包括 #包括 #包括 结构体{ 整数我; 浮动 f; ...

回答 1 投票 0

如何删除 std::string 上以“//”开头的每一行?

我有以下模板 std::string std::string myString = R"svg( // 我有以下模板 std::string std::string myString = R"svg( <svg height={size} width={size}> <rect {...rectProps} x={x0h} y={y0h} /> // <rect {...rectProps} x={x1h} y={y0h} /> <rect {...rectProps} x={x0h} y={y1h} /> // <rect {...rectProps} x={x1h} y={y1h} /> </svg> )svg"; 我想删除以 // 开头的每一行 所以我想要的结果就是这样的 <svg height={size} width={size}> <rect {...rectProps} x={x0h} y={y0h} /> <rect {...rectProps} x={x0h} y={y1h} /> </svg> 编辑:所以我现在的想法是迭代每一行,修剪它,然后检测它是否以“//”开头 到目前为止我有这个伪 std::istringstream stream(myString); std::string line; std::string myFinalString; while (std::getline(stream, line)) { // TODO: trim line first bool isComment = false; // Find here if the line starts with // if (!isComment) { myFinalString += line + "\n"; } } 最简单的方法是使用正则表达式库: #include <iostream> #include <regex> int main() { std::string myString = R"svg( <svg height={size} width={size}> <rect {...rectProps} x={x0h} y={y0h} /> // <rect {...rectProps} x={x1h} y={y0h} /> <rect {...rectProps} x={x0h} y={y1h} /> // <rect {...rectProps} x={x1h} y={y1h} /> </svg> )svg"; std::cout << myString << std::endl; //before std::string new_string = std::regex_replace(myString, std::regex("\n *//.*\n"), "\n"); std::cout << new_string << std::endl; //after } 我们捕获所有以新行 \n 开头、具有零个或多个空格 *、两个斜杠 // 以及零个或多个以另一新行结尾的任何字符 .* 的模式。我们仅用一个新行替换出现的事件(以补偿其中一个)。 输出: <svg height={size} width={size}> <rect {...rectProps} x={x0h} y={y0h} /> // <rect {...rectProps} x={x1h} y={y0h} /> <rect {...rectProps} x={x0h} y={y1h} /> // <rect {...rectProps} x={x1h} y={y1h} /> </svg> <svg height={size} width={size}> <rect {...rectProps} x={x0h} y={y0h} /> <rect {...rectProps} x={x0h} y={y1h} /> </svg> 基于 std::basic_string::find_first_not_of 找到的 '/' 的数量使用 std::basic_string::erase 的简单性很难被击败,例如 std::string s { "//Some comment" }; if (s.at(0) == '/') s.erase (0, s.find_first_not_of ("/")); 您还可以通过将 "//" 添加到拒绝字符来删除 " \t" 之前的任何前导空格: std::string s { " //Some comment" }; if (s.at(s.find_first_not_of (" \t/") - 1) == '/') s.erase (0, s.find_first_not_of (" \t/")); (注意: - 1 与 at() 是必需的,因为它需要从零开始的索引,而 erase() 需要删除字符数) 然后要处理 "//" 周围的前导和尾随空白,您可以 #include <cctype> 并使用 isspace(c),如下所示: std::string s { " // Some comment" }; char c = s.at(s.find_first_not_of (" \t/") - 1); if (c == '/' || isspace (c)) s.erase (0, s.find_first_not_of (" \t/")); 在所有情况下,结果都是"Some comment"。 没有按我的预期工作 除了它之外,它绝对不会按照你的方式工作。 您使用的 erase 的过载看起来像 string& erase( size_type index = 0, size_type count = npos); 来自 cppreference 的重载描述: 删除从索引开始的 min(count, size() - index) 个字符。 所以你真正做的svg.erase(0, svg.find("//") + 1)是删除从索引[0]到[你找到的最后一个'/'的索引]的所有字符 相反,您应该执行以下操作: 在字符串中搜索 "//",将此位置命名为 A。 在字符串中搜索 '\n',将此位置命名为 B。 擦除间隔[A; B] 来自字符串或 [A; svg.length()] 如果你没有找到 B 重复直到没有位置A P.s.我建议从末尾而不是从头开始搜索,因为如果它更接近末尾而不是开头,则擦除片段形式的字符串会更容易 P.p.s.如果您想精确删除间隔,请务必使用迭代器,因为删除间隔的 erase 的唯一重载是 iterator erase( const_iterator first, const_iterator last ); 最后这就是我找到的解决方案 std::string trim(const std::string &str) { size_t first = str.find_first_not_of(' '); if (std::string::npos == first) { return str; } size_t last = str.find_last_not_of(' '); return str.substr(first, (last - first + 1)); } bool startsWith(const std::string &input, const std::string &start) { return input.find(start) != std::string::npos; } std::string myString = R"svg( <svg height={size} width={size}> <rect {...rectProps} x={x0h} y={y0h} /> // <rect {...rectProps} x={x1h} y={y0h} /> <rect {...rectProps} x={x0h} y={y1h} /> // <rect {...rectProps} x={x1h} y={y1h} /> </svg> )svg"; std::istringstream stream(myString); std::string line; std::string myFinalString; while (std::getline(stream, trim(line))) { if (!startsWith(line, "//")) { myFinalString += line + "\n"; } }

回答 4 投票 0

使自定义类型的行为类似于 std::string

我必须定义一些包含 std::string 类型成员的结构。我需要让它们表现得像 std::string 。换句话说,它们应该可以简单地转换为 std::string 但不能转换为...

回答 1 投票 0

字符串移动后,std::string::c_str()返回的数据仍然有效吗?

假设我有一个异步发送 const char * 数据的函数,并在发送数据或发生错误时调用回调(我省略了与问题无关的错误处理): 无效

回答 1 投票 0

为什么 lambda 不会将字符串文字返回到 std::string 中?

//示例:-std=c++20 std::string(*l)() { [](){ return "s";} }; //不起作用 std::string s {"mm"}; //作品 std::string fs(){ 返回“bb”; //作品 } 我确定...

回答 1 投票 0

c_str() 不返回任何内容,但字符串不为空

所以,我有课 类我的超级类{ 民众: std::字符串缓冲区; }; 并想要将缓冲区打印到 std::cout。 以下是一些有关从文件填充字符串的代码: MySuperClass MSC; std::fstream fi...

回答 1 投票 0

如何让我的终端在 C++ 中的空 cin 输入上退出?

我找不到一种方法让我的终端在空输入时退出程序。我有: int main(int argc, char const* argv[]) { // 在这里写下你的代码 // 定义变量 设置

回答 1 投票 0

覆盖 std::string 的空终止符是否合法?

在 C++11 中,我们知道 std::string 保证是连续的且以 null 终止(或者更迂腐地,以 charT() 终止,在 char 的情况下是空字符 0)。 我在那里...

回答 4 投票 0

C++ 迭代器做奇怪的事情

我可能完全愚蠢,但是: 词法分析器类 { 私人的: std::string::迭代器开始; std::string::迭代器当前; std::字符串源; 内部线; 标准::

回答 1 投票 0

basic_string.tcc 中的核心转储 - 优化了

偶尔我会遇到一些核心转储,我不明白为什么会发生。通常,当将 av 值分配给字符串时会发生这种情况。以下是其中一种情况的回溯。核心...

回答 2 投票 0

禁用 std:string 的 SSO

我想知道是否有一种方法可以通过编程方式禁用字符串 SSO,使其不使用本地缓冲区来存储短字符串?

回答 1 投票 0

尝试使用 C++ 从字符串中删除所有非字母字符,鉴于我拥有的代码,最好的方法是什么?

我是 C++ 初学者,对该语言还不太熟悉。那么修复我的代码最简单的方法是什么?我认为 userInput.insert(i, ""); 有问题但我...

回答 2 投票 0

std::string length() 和 size() 成员函数

我正在阅读这个问题的答案,发现实际上有一个名为 length() 的方法用于 std::string (我总是使用 size() )。在...中使用此方法有什么具体原因吗?

回答 4 投票 0

如何获取两个字符串向量之间不同或共同元素的数量?

是否有一个函数可以比较两个字符串向量以返回不同(或相同)元素的数量?我是否必须迭代它们并逐项测试?

回答 4 投票 0

C++中将数字转换为指定长度的字符串

我有一些不同长度的数字(如 1、999、76492 等),我想将它们全部转换为具有公共长度的字符串(例如,如果长度为 6,那么这些字符串将是: '000...

回答 10 投票 0

如何在函数中迭代 std::string const& ?

我将 const 引用 std::string 传递给函数。我想迭代字符串的三元组并将这些三元组转换为整数。我通过位移来做到这一点。我的问题是我不知道...

回答 1 投票 0

为什么在包含 <string.h> 并使用 std::basic_string 时会出现编译器错误?

当我尝试编译以下代码时: #包括 使用命名空间 std; typedef std::basic_string foostring; foostring foo = "foo"; 我收到以下错误: 字符串...

回答 1 投票 0

C++ 中的简单 FizzBuzz 程序出现意外输出

我只是尝试实现一个简单的 FizzBuzz 程序,其中我试图将规则集与逻辑分开,这是我在编译器资源管理器中执行此操作的尝试,没有使用...

回答 1 投票 0

在c++中将字符串转换为argv

我有一个 std::string ,其中包含要使用 execv 执行的命令,将其转换为 execv() 第二个参数所需的“char *argv[]”的最佳“C++”方法是什么? 为了澄清...

回答 11 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.