我想要一个函数,它将采用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这样的缓冲区长度.但我猜你不能动态设置缓冲区长度?也许我可以挑选一个任意大的缓冲区?我有点担心如何使它成为通用的.
如何编写一个函数来实现这一目标?
我有一个函数可以处理来自任意长度字符串的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++缺乏经验.
还有其他的,或许更好的方法吗?
谢谢!
我找了一下上一个转换的最佳方法的建议std::wstring,以std::string-但一个快速和肮脏的转换用作一个关键std::map<std::string, int>对象.
地图非常大,并且已经很好地集成到项目中,并且只有少数键需要这种转换,因此我认为将地图更改为接受std::wstring键的地图将是浪费.
转换的输出并不重要,但必须保持一致,以便每次都可靠地从地图中提取正确的值.
该应用程序是仅限Windows的应用程序.
是否有任何已知的过程可靠地为此目的进行粗略转换?或者最好的方法是通过通常的,正确的转换过程(如本问题/答案中所述:如何将wstring转换为字符串?)?
编辑:请记住 - 只要事情一致,丢失的信息就可以了.即如果我投入一些日文字符,并且它们一直转换成相同的(可能是垃圾)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(),但我的工作的代码使用了大量的数据流,并且我认为这是很好的做法,以保持我的代码添加的一贯作风.
我是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) 我正在尝试创建一个函数,该函数采用可变数量的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只,避免 …
有一个简单的方法吗?我尝试过以下方法:
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) 假设以下代码:
#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: ''
#include <string>
using namespace std;
int main()
{
string s; // no warning
int i; // warning C4101
return 0;
}
Run Code Online (Sandbox Code Playgroud)
i但s示例中没有?我的警告级别设置为4.
在C++ 14程序中,我给了一个类似的字符串
std::string s = "MyFile####.mp4";
Run Code Online (Sandbox Code Playgroud)
和0到几百的整数.(它永远不会是一千个或更多,但只有四个数字.)我想####用整数值替换" ",根据需要使用前导零来匹配'#'字符数.什么是灵活的C++ 11/14修改s或生成这样的新字符串的方法?
通常我会使用char*字符串snprintf(),strchr()并找到" #",但我应该得到现代和std::string更频繁使用,但只知道它的最简单的用途.