我想知道,我通常使用std :: string作为我的代码,但是当你在一个参数中传递一个字符串进行简单的比较时,最好只使用一个文字吗?
考虑这个功能:
bool Message::hasTag(string tag)
{
for(Uint tagIndex = 0; tagIndex < m_tags.size();tagIndex++)
{
if(m_tags[tagIndex] == tag)
return 0;
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
尽管它正在进行比较的属性是一个向量,并且无论使用这个函数可能会将字符串传递给它,使用const char*来避免创建一个新的字符串仍然会更好一个字符串文字呢?
我们有:
std::string string_array[2];
string_array[0] = "some data";
string_array[1] = "some more data";
char* cstring_array[2];
Run Code Online (Sandbox Code Playgroud)
将数据从string_array复制到cstring_array的最有效方法是什么?或者将string_array传递给函数,需要" const char* cstring_array[]"?
如何在保留'\ 0'字符的同时将std :: string转换为LPCSTR?
我想在OPENFILENAME.lpstrFilter上使用结果,该结果要求过滤器包含'\ 0'作为分隔符.
std :: string.c_str()似乎剥离和修剪'\ 0'
提前致谢!
==========================
(如何在论坛中正确添加评论,如回复帖?)
看完你的评论后,我继续仔细检查这个片段:
std::string filter = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0";
const char* f1 = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0";
const char* f2 = filter.c_str();
for(int i = 0; i < 50; i++)
{
char c1 = *(f1 + i); // works
char c2 = *(f2 + i); // doesn't work. beyond the first \0, it's garbage.
}
Run Code Online (Sandbox Code Playgroud)
我错误地认为c_str()或LPCSTR是如何工作的?
只需阅读21.3.6.1 basic_string :: find - 并且没有提到pos参数在字符串本身的范围内.
21.3.6.1 basic_string :: find
size_type find(const basic_string&str,size_type pos = 0)const;
1效果:如果可能,确定最低位置xpos,以便以下两个条件获得:
- pos <= xpos和xpos + str.size()<= size();
- at(xpos + I)== str.at(I)表示str控制的字符串的所有元素.
2返回:如果函数可以为xpos确定这样的值,则返回xpos.否则,返回npos.
我正确读到这个?
请帮助我将unicodestring转换为字符串
这就是我获得unicodestring的方式
UnicodeString _str = OpenDialog1->FileName;
Run Code Online (Sandbox Code Playgroud)
或者如果可以用ifstream或类似的东西写入文件unicode字符串?
谢谢
我正在寻找一种实现sprintf()功能的方法std::string,我从std :: string格式如sprintf找到了一个很好的答案.这有点不好看,因为它直接写入从返回的指针string.c_str().所以我使用char *with malloc()和realloc().重新实现它.
std::string string_format(const char * format, ...) {
size_t size;
size_t n;
va_list args;
char * buffer;
std::string str;
size = 100;
buffer = malloc(size);
for (;;) {
va_start(args, format);
n = vsnprintf(buffer, size, format, args);
va_end(args);
if (n > -1) {
if (n < size) {
size = n;
break;
}
size = n + 1;
} else {
size *= 2; …Run Code Online (Sandbox Code Playgroud) 给定C++中的标准字符串对象,其中包含转义序列,如何在运行时将其转换为自身的引用版本?
std::string str("Foo said, \"bar\"\n");
Run Code Online (Sandbox Code Playgroud)
鉴于上述情况,我想创建一个新字符串quoted,其中包含以下内容:
"\"Foo said, \\\"bar\\\"\\n\""
Run Code Online (Sandbox Code Playgroud)
这只是一个例子.我需要使用任意字符串执行此操作.
我是否只需要为每个可能的转义序列手动执行此操作?
我试图根据自定义比较器函数对字符串向量进行排序 - :
#include<bits/stdc++.h>
using namespace std;
template<typename T>
std::string ToString( const T& obj )
{
std::stringstream ss;
ss << obj;
return ss.str();
}
bool comp( string num1, string num2 )
{
bool swapped = false;
if ( num2.size() > num1.size() )
{
swap( num1, num2 );
swapped = true;
}
size_t i = 0;
size_t j = 0;
while ( i < num1.size() && j < num2.size() )
{
if ( num1[i] > num2[j] )
{
return !swapped;
} …Run Code Online (Sandbox Code Playgroud) 由于遗留原因,const char*我正在处理的代码中有很多用法。我试图限制这一点,偶然发现了我想知道的东西。我有类似的东西:
class AClass {
public:
const char* getValue() { return _value.c_str(); }
private:
std::string _value;
}
Run Code Online (Sandbox Code Playgroud)
但是,此类现在可以通过副本返回,例如。按功能:
AClass getAClass();
Run Code Online (Sandbox Code Playgroud)
我们也可能想将其传递给这样的东西:
void functionFromOtherLibrary(const char* value);
Run Code Online (Sandbox Code Playgroud)
现在考虑一下,这可能会导致错误:
functionFromOtherLibrary(getAClass().getValue());
Run Code Online (Sandbox Code Playgroud)
因为该中间体有资格在那时被销毁。即使上面的方法没问题,因为这只是一个陈述,所以这可能不会:
const char* str = getAClass().getValue();
functionFromOtherLibrary(str);
Run Code Online (Sandbox Code Playgroud)
所以我在想写一些类似的东西:
class AClass {
public:
const char* getValue() { return _value.c_str(); }
const char* getValue() && = delete;
}
Run Code Online (Sandbox Code Playgroud)
禁止在右值上调用该方法。只是尝试给了我:
error C2560: cannot overload a member function with ref-qualifier with a member function without ref-qualifier
Run Code Online (Sandbox Code Playgroud)
我不确定这是否:
const char*s 的代码,它似乎总是依赖于这样一个事实,即返回值的对象仍然存在并保存源代码std::string。 …我的程序很简单,我想使用原子类型。可以使用int,double但不能使用std::string。
#include <iostream>
#include <atomic>
#include <string>
int main()
{
std::atomic<int> test(0); // works
std::cout<<test; // will print 0
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我更改为
std::atomic<std::string> test("0");
Run Code Online (Sandbox Code Playgroud)
它将给出此错误
/ usr / include / c ++ / 6 / atomic:在'struct std :: atomic>'的实例中:main.cpp:16:34:
从此处需要/ usr / include / c ++ / 6 / atomic:178:7:错误:静态断言失败:std :: atomic需要一个普通可复制类型static_assert(__ is_trivially_copyable(_Tp),^ ~~~~~~~~~~~~~
我已经使用C ++ 17,C ++ 14和C ++ 11测试了该代码。遵循此线程std :: atomic <std :: string>是否正常工作?原子字符串应该可以正常工作,但是出现了这个错误。这是什么原因呢?以及如何std::atomic<std::string>正确使用?