标签: stdstring

比较包含负字符的字符串时出现令人惊讶的结果

#include "stdafx.h"
#include "iostream"
#include "string"

using namespace std;

void main()
{
    string a = "a";
    string b(1, -70); /*constructor, create a string having 1 character that its value is equal to -70*/
    cout << (b > a ? b : a);
}

//output on screen: b was printed, not a (!)
Run Code Online (Sandbox Code Playgroud)

虽然b的值小于a的值,为什么b>a?我该如何纠正这种情况?

c++ string comparison stdstring

5
推荐指数
1
解决办法
770
查看次数

使用比较运算符将 std::string 作为 std::map 中的键

我正在尝试使用 std::string 作为 std::map 中的键,但是,我无法正确 find() 。我的代码有点复杂和大,所以这是一个演示我遇到的问题的小程序。如果有人能告诉我为什么这不起作用,我将不胜感激。

谢谢。

#include <stdio.h>
#include <string>
#include <map>

struct comparer
{
    public:
    bool operator()(const std::string x, const std::string y)
    {
         return x.compare(y)==0;
    }
};

int main(int argc, char *argv[])
{
    std::map<std::string, int, comparer> numbers;
    numbers.insert(std::pair<std::string,int>("One",1));
    numbers.insert(std::pair<std::string,int>("Two",2));
    numbers.insert(std::pair<std::string,int>("Three",3));
    numbers.insert(std::pair<std::string,int>("Four",4));
    numbers.insert(std::pair<std::string,int>("Five",5));


    std::map<std::string, int, comparer>::iterator it=numbers.find("Three");
    if(it!=numbers.end())
        printf("The number is %d\n",(*it).second);
    else
        printf("Error, the number is not found\n");
}
Run Code Online (Sandbox Code Playgroud)

c++ key stdmap std stdstring

5
推荐指数
1
解决办法
3万
查看次数

如何将 C++ 字符串中的单词大写?

我有一个 std::string 并希望第一个字母大写,其余字母小写。

我可以这样做的一种方法是:

const std::string example("eXamPLe");
std::string capitalized = boost::to_lower_copy(example);

capitalized[0] = toupper(capitalized[0]);
Run Code Online (Sandbox Code Playgroud)

这将产生capitalized:

“例子”

但也许有更直接的方法来做到这一点?

c++ boost capitalize stdstring

5
推荐指数
1
解决办法
4762
查看次数

为什么 C++11 中 std::string 没有 const char* 强制转换运算符?

在C++03中,对于std::string类c_str()和data()方法有不同的行为。

第一个返回一个以空结尾的字符数组,最后一个的管理完全依赖于实现。事实上,c_str() 可以返回指向另一个预分配缓冲区的指针,该缓冲区始终包含一个以 null 结尾的字符串,但这不是强制性的。然而,复杂性必须是恒定的。

第二个只是返回指向 的内部缓冲区的指针std::string,该缓冲区可以是空终止的,也可以不是。

因此,在 C++03 中,您可能会猜测强制转换运算符 toconst char*不是一个好主意。事实上,大多数时候,预期的行为是有一个以 null 结尾的 C 风格字符串,但是,由于 的实现c_str()可能会有所不同,因此强制转换运算符后面可能存在隐藏的开销。在另一种情况下,如果强制转换运算符返回与 相同的结果,可能会带来混乱data()。

但是,对于 C++11,c_str()和data()具有相同的行为。c_str()返回指向对象内部缓冲区的指针std::string。强制转换运算符 toconst char*不再含糊不清。std::string为什么C++11 中的类中没有此方法?

谢谢 !

c++ stl stdstring c++11

5
推荐指数
1
解决办法
1495
查看次数

将通过复制传递std :: string进行优化吗?

在我们的项目中有许多函数,其中字符串通过副本传递:

void f(std::string a);
Run Code Online (Sandbox Code Playgroud)

众所周知,通过引用传递它会更有效,但我的同事说编译器无论如何都会优化它.这对GCC来说是否接近真相?

发布版本中启用了G ++ 4.8.2,-O2.

谢谢!

c++ gcc stdstring

5
推荐指数
1
解决办法
105
查看次数

从std:string派生以添加typedef和enums

对于客户端和服务器之间交换的UDP包,我想支持两种字符串字段:

  • 以null结尾的c-string命名 cstring
  • 前面写有uint8_tsize-field的字符串vstring

要自我记录我们的包的布局,我想使用简单的结构声明:

struct ABC {
  vstring a;
  cstring b;
}
Run Code Online (Sandbox Code Playgroud)

并调用重载函数get(char*, vstring& v)和get(char*, cstring&)内部de /序列化函数,如下所示:

void deserialize(const char* bytes, ABC& msg) {
  get(msg.a);
  get(msg.b);
}

void serialize(char* bytes, const ABC& msg) {
  put(msg.a);
  put(msg.b);
}
Run Code Online (Sandbox Code Playgroud)

但是,对于用户而言vstring,cstring理想情况下应该像正常一样std::string.

我的第一个想法是简单地进行std::string的民意基础vstring,并cstring使得两个类可以超载解析期间,disriminated而是表现为用户相同.但由于std::string劝阻,我不确定该怎么办.

c++ inheritance stdstring c++11

5
推荐指数
1
解决办法
157
查看次数

代表日期的字符串并将其转换

要格式化表示从其他部分收到的日期的字符串,需要进行一些转换:

source:
    std::string s = "20190510";
target:
    std::string t = "05/10/2019";
Run Code Online (Sandbox Code Playgroud)

一种方法是逐个字符地复制char,是否有一种优雅的方法可以使其美观又快速?

更新:对不起,转换应该是从“ yyyymmdd”到“ mm / dd / yyyy”。

c++ string stdstring c++11

5
推荐指数
1
解决办法
127
查看次数

Visual Studio 调试器在调试中无法正确显示 std::string

当我暂停程序时,我和我的团队遇到了 Visual Studio 显示乱码而不是正确字符串内容的问题。里面的字符串数据是正确的,只是VS的调试器不知何故丢失了。

\n\n

我将正确的内容标记为绿色,错误的内容标记为红色。

\n\n

VS 16.3.4 中的 std::string 乱码问题

\n\n

你可以看到std::string定义为

\n\n
const std::string testStdString = "contents of std::string";\n
Run Code Online (Sandbox Code Playgroud)\n\n

显示为"\\b\xc3\x84\xc4\x8eD\\x19"调试悬停和监视窗口。但 C 弦.c_str()显示良好。写入的控制台cout也显示正常。\n这个损坏的值在每次运行时都会发生变化。

\n\n

在原始视图模式下,您可以看到指针内容显示为 ASCII 时,看起来就像调试器认为的字符串内容。那么也许有一些短字符串优化相关的问题?

\n\n

字符串的原始视图

\n\n

如果将其解码为字符串:

\n\n
"\\b\xc3\x84\xc4\x8eD\\x19"\n    [0x00000000]: 0x08 \'\\b\'\n    [0x00000001]: 0xc4 \'\xc3\x84\'\n    [0x00000002]: 0xcf \'\xc4\x8e\'\n    [0x00000003]: 0x44 \'D\'\n    [0x00000004]: 0x19 \'\\x19\'\n    [0x00000005]: 0x00 \'\\0\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

它buf与原始视图中可见的属性匹配:(0x0000001944cfc408相反顺序)。

\n\n

问题仅影响std::string和std::wstringC 字符串工作正常。当我尝试使用std::string::c_str()它时效果也很好。

\n\n

当我尝试使用一个简单的新项目时,不会出现此问题 - 但在我们使用本机 C++ 和 C# UWP 解决方案的 …

c++ stdstring visual-studio-debugging visual-studio-2019

5
推荐指数
1
解决办法
2563
查看次数

为什么 std::string 的成员 operator= 不是左值引用限定的

我最近了解到成员函数可以是ref-qualified,这使我可以编写

struct S {
    S& operator=(S const&) & // can only be used if the implicit object is an lvalue
    { 
      return *this; 
    }
};

S operator+(S const &, S const &) { 
  return {}; 
}
Run Code Online (Sandbox Code Playgroud)

从而阻止用户做类似的事情

S s{};
s + s = S{}; // error
Run Code Online (Sandbox Code Playgroud)

然而,我看到该std::string成员operator= 并没有这样做。所以下面的代码编译时没有警告

std::string s;
s + s = s;
Run Code Online (Sandbox Code Playgroud)

有理由允许这样做吗?

如果没有,将来是否可以添加引用限定符,或者会以某种方式破坏现有代码吗?

c++ operator-overloading stdstring ref-qualifier

5
推荐指数
1
解决办法
184
查看次数

为什么 std::max 不适用于字符串文字?

我试图找到两个字符串的最大值,它在第一种情况下(传递std::string变量时)给出了正确的答案,但在第二种情况下(传递直接字符串时)给出了错误。

#include<bits/stdc++.h>
using namespace std;

int main()
{
    // Case 1
    string str1 = "abc", str2 = "abcd";
    cout << max(str1, str2) << endl;

    // Case 2
    cout << max("abc", "abcd") << endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ algorithm std max stdstring

5
推荐指数
1
解决办法
742
查看次数