标签: stdstring

c ++将time_t格式化为std :: string:buffer length的函数?

我想要一个函数,它将采用time_t参数和任意格式字符串并对其进行格式化.我想要这样的东西:

std::string GetTimeAsString(std::string formatString, time_t theTime)
{
    struct tm *timeinfo;
    timeinfo = localtime( &theTime);

    char buffer[100];
    strftime(buffer, 100, formatString.c_str(), timeinfo);
    std::string result(buffer);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

但是我遇到的一个问题是缓冲区长度.我想做一些像formatString*4这样的缓冲区长度.但我猜你不能动态设置缓冲区长度?也许我可以挑选一个任意大的缓冲区?我有点担心如何使它成为通用的.

如何编写一个函数来实现这一目标?

c++ time buffer strftime stdstring

6
推荐指数
3
解决办法
7781
查看次数

如何迭代128位块中的字符串?

我有一个函数可以处理来自任意长度字符串的128位数据块.如果字符串不能均匀地分成128位的块,则会相应地填充它.

目的是转换输入函数的字符串中的数据.

我最初想过循环字符串这样:

//This might have stupid errors.  Hopefully it stillg gets the point across.
for (int i = 0; i < strn.size(); i += 16)
{
    string block = strn.substr(i, i + 15);
    strn.replace(i, i + 15, block);
}
Run Code Online (Sandbox Code Playgroud)

我想这会起作用,但我认为必须有一种更优雅的方式来做到这一点.想到的一个想法是封装strn在一个类中并实现我自己的迭代器,它可以以128位块的形式读取其内容.这很有吸引力,因为构造函数可以处理填充,我当前使用的一些函数可以是私有的,从而避免了潜在的误用.这看起来像是一种富有成效的方法吗?如果是这样,那么如何实现自己的迭代器呢?我非常欢迎详细的解释,因为我对C++缺乏经验.

还有其他的,或许更好的方法吗?

谢谢!

c++ iterator stdstring

6
推荐指数
1
解决办法
912
查看次数

C++ - std :: wstring to std :: string - 快速和脏转换,用作std :: map中的键

我找了一下上一个转换的最佳方法的建议std::wstring,以std::string-但一个快速和肮脏的转换用作一个关键std::map<std::string, int>对象.

地图非常大,并且已经很好地集成到项目中,并且只有少数键需要这种转换,因此我认为将地图更改为接受std::wstring键的地图将是浪费.

转换的输出并不重要,但必须保持一致,以便每次都可靠地从地图中提取正确的值.

该应用程序是仅限Windows的应用程序.

是否有任何已知的过程可靠地为此目的进行粗略转换?或者最好的方法是通过通常的,正确的转换过程(如本问题/答案中所述:如何将wstring转换为字符串?)?

编辑:请记住 - 只要事情一致,丢失的信息就可以了.即如果我投入一些日文字符,并且它们一直转换成相同的(可能是垃圾)std::string,那很好.这永远不会用于显示,只能用作从地图中提取值的键.

谢谢!

c++ stdstring

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

从C++流中读取特定数量的字符到std :: string

我对大多数C++都非常熟悉,但我避免的一个领域是IO流,主要是因为我一直在嵌入式系统中使用它们,因为它们不合适.然而,最近我不得不熟悉它们,而我正在努力找出一些我认为应该简单的东西.

我正在寻找一种相对有效的方法从C++流中读取固定数量的字符到std::string.我可以轻松地char使用该read()方法读入临时数组并将其转换为a std::string,但这相当丑陋且涉及浪费的副本.我还可以将整个流读入一个字符串,如下所示:

std::string getFile(std::fstream &inFile)
{
    std::stringstream buffer;
    buffer << inFile.rdbuf();
    return buffer.str();
}
Run Code Online (Sandbox Code Playgroud)

...但无限读入内存通常是一个糟糕的想法,所以我真的想一次访问一个块,比如4K左右.我也可以一次读取字符,但这比阅读临时char数组感觉更丑陋,效率更低.

那么,是否有一种简单的方法可以std::string直接从包含流中下一个N个字符的流中获取?很可能根本就没有办法做到这一点,但我觉得这样的事情会丢失,所以我觉得我必须错过一些明显的东西.

顺便说一下,我对C文件IO API非常熟悉,我不是在寻找涉及它们的解决方案.我可以敲东西了read()和write(),但我的工作的代码使用了大量的数据流,并且我认为这是很好的做法,以保持我的代码添加的一贯作风.

c++ iostream stdstring

6
推荐指数
1
解决办法
4478
查看次数

Valgrind抱怨std :: string构造函数中的字节丢失了

我是valgrind的新手,所以这可能会错过解释输出.Valgrind似乎认为字节在以下几行中丢失:

if ( mysqlpp::StoreQueryResult result = query.store() ){
   for ( size_t i = 0; i < result.num_rows(); ++i ){
       hash = std::string( result[i]["hash"].data(), result[i]["hash"].length() );
       label = std::string( result[i]["label"].data(), result[i]["label"].length() );
       keywords = std::string( result[i]["keywords"].data(), result[i]["keywords"].length() );
       task_raw = std::string( result[i]["task"].data(), result[i]["task"].length() );
       solution_raw = std::string( result[i]["solution"].data(), result[i]["solution"].length() );
Run Code Online (Sandbox Code Playgroud)

事实上,每当有一个std :: string以这种方式构建时,它就会抱怨^^.如果我正在复制的方式不正确,或者结果是以某种方式泄露,我无法弄清楚这是否是误报.

有趣的是,它抱怨另一段不使用mysql ++的代码,但同样使用了一个字符串构造函数:

for ( auto & f : frames ){
  for ( unsigned int i = 0; i < f.getTask().size(); i++ ){
     if ( i + 1 < …
Run Code Online (Sandbox Code Playgroud)

c++ valgrind stdstring memcheck c++11

6
推荐指数
0
解决办法
5888
查看次数

仅带有std :: string的C ++变量参数

我正在尝试创建一个函数,该函数采用可变数量的std :: string参数并使用它格式化字符串。

例:

Test::formatLine(const string::format, ...)
{
    const std::string buffer;
va_list args;
va_start(args, format);
vsprintf(buffer.c_str, format.c_str, args);
va_end(args);
cout << buffer << endl;
}
Run Code Online (Sandbox Code Playgroud)

编译此代码段错误:

Error   1   error C3867: 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str': function call missing argument list; use '&std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str' to create a pointer to member
Run Code Online (Sandbox Code Playgroud)

我要实现的目标:

Test t = Test();
t.formatLine("Hello %s!", "monsieur");
Run Code Online (Sandbox Code Playgroud)

应该打印 Hello monsieur!

t.formatLine("Hello %s %s! How %s you today?", "good", "sir", "are");
Run Code Online (Sandbox Code Playgroud)

应该打印 Hello good sir! How are you today?

它甚至有可能使用va_list,并vsprintf与std::string只,避免 …

printf variadic-functions stdstring c++11

6
推荐指数
2
解决办法
1万
查看次数

将boost :: container :: boost basic_string转换为std :: string

有一个简单的方法吗?我尝试过以下方法:

typedef allocator<char,managed_shared_memory::segment_manager>
    CharAllocator;
typedef boost::container::basic_string<char, std::char_traits<char>, CharAllocator>
    my_basic_string;

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

c++ boost stdstring boost-interprocess

6
推荐指数
1
解决办法
2202
查看次数

为什么要编译:string = int

假设以下代码:

#include <iostream>
#include <string>

int func() { return 2; }

int main()
{
   std::string str("str");
   str = func();
   std::cout << "Acquired value: '" << str << "'" << std::endl;

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么行str = func();编译时没有出现类型不匹配的警告?

我正在使用编译器gcc v.4.7.1并设置-std = c ++ 11标志.

输出:

Acquired value: ''

c++ gcc stdstring c++11

6
推荐指数
1
解决办法
203
查看次数

如何让Visual Studio 2010警告未使用的变量?

#include <string>

using namespace std;

int main()
{
    string s; // no warning
    int i;    // warning C4101

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 为什么Visual Studio会警告我未使用的变量,i但s示例中没有?
  2. 我假设编译器不确定字符串构造函数的副作用.这是不显示警告的原因吗?
  3. 我能以某种方式启用有关未使用的字符串变量的警告?

我的警告级别设置为4.

c++ stdstring visual-studio-2010 compiler-warnings

6
推荐指数
1
解决办法
1062
查看次数

如何将带前导零的整数插入到std :: string中?

在C++ 14程序中,我给了一个类似的字符串

std::string  s = "MyFile####.mp4";
Run Code Online (Sandbox Code Playgroud)

和0到几百的整数.(它永远不会是一千个或更多,但只有四个数字.)我想####用整数值替换" ",根据需要使用前导零来匹配'#'字符数.什么是灵活的C++ 11/14修改s或生成这样的新字符串的方法?

通常我会使用char*字符串snprintf(),strchr()并找到" #",但我应该得到现代和std::string更频繁使用,但只知道它的最简单的用途.

c++ stdstring c++14

6
推荐指数
3
解决办法
1386
查看次数