此代码使用Visual C++ 11进行编译,并在Windows 7上按预期运行,但无法使用Windows 7上的MinGW 4.7.0或Linux上的gcc 4.8.0进行编译.用-std=c++11旗帜编译
#include <codecvt>
#include <string>
// convert UTF-8 string to wstring
std::wstring utf8_to_wstring (const std::string& str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.from_bytes(str);
}
// convert wstring to UTF-8 string
std::string wstring_to_utf8 (const std::wstring& str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.to_bytes(str);
}
Run Code Online (Sandbox Code Playgroud)
错误:
codecvt:没有这样的文件或目录.
我有这个csv线
std::string s = R"(1997,Ford,E350,"ac, abs, moon","some "rusty" parts",3000.00)";
Run Code Online (Sandbox Code Playgroud)
我可以用boost::tokenizer以下方法解析它:
typedef boost::tokenizer< boost::escaped_list_separator<char> , std::string::const_iterator, std::string> Tokenizer;
boost::escaped_list_separator<char> seps('\\', ',', '\"');
Tokenizer tok(s, seps);
for (auto i : tok)
{
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它是正确的,除了令牌"生锈"应该有双引号被剥离.
这是我尝试使用boost :: spirit
boost::spirit::classic::rule<> list_csv_item = !(boost::spirit::classic::confix_p('\"', *boost::spirit::classic::c_escape_ch_p, '\"') | boost::spirit::classic::longest_d[boost::spirit::classic::real_p | boost::spirit::classic::int_p]);
std::vector<std::string> vec_item;
std::vector<std::string> vec_list;
boost::spirit::classic::rule<> list_csv = boost::spirit::classic::list_p(list_csv_item[boost::spirit::classic::push_back_a(vec_item)],',')[boost::spirit::classic::push_back_a(vec_list)];
boost::spirit::classic::parse_info<> result = parse(s.c_str(), list_csv);
if (result.hit)
{
for (auto i : vec_item)
{
cout << i << endl;
} …Run Code Online (Sandbox Code Playgroud) 我想摆脱所有无效的角色; 示例hexadecimal value 0x1A来自使用sed的XML文件.
什么是正则表达式和命令行?
编辑
添加了Perl标签,希望获得更多响应.我更喜欢单线解决方案.
编辑
这些是有效的XML字符
x9 | xA | xD | [x20-xD7FF] | [xE000-xFFFD] | [x10000-x10FFFF]
Run Code Online (Sandbox Code Playgroud) 我是D的新手.我正在寻找相当于这个C++声明
typedef std::vector<std::string> the_value;
std::map<std::string,the_value> the_table;
Run Code Online (Sandbox Code Playgroud) 假设我有一个空终止字符串向量,其中一些可能是空指针。我不知道这是否合法。这是一个学习练习。
示例代码
std::vector<char*> c_strings1;
char* p1 = "Stack Over Flow";
c_strings1.push_back(p1);
p1 = NULL; // I am puzzled you can do this and what exactly is stored at this memory location
c_strings1.push_back(p1);
p1 = "Answer";
c_strings1.push_back(p1);
for(std::vector<char*>::size_type i = 0; i < c_strings1.size(); ++i)
{
if( c_strings1[i] != 0 )
{
cout << c_strings1[i] << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,即使我在位置c_strings1[1]
Question处有一个 NULL,向量的大小也是 3 。std::vector<char>
当您推送空值时,如何使用向量中到底存储了什么来
重写此代码?
编辑
我的问题的第一部分已得到彻底解答,但第二部分尚未得到解答。至少我不满意。我确实想看看vector<char>;的用法 不是一些嵌套变体或std::vector<std::string>那些熟悉的变体。所以这是我尝试过的(提示:它不起作用)
std::vector<char> c_strings2;
string …Run Code Online (Sandbox Code Playgroud) 此缓冲区应包含相等长度的槽(本例中为3个)(本例中为20个)
缓冲区必须具有连续的内存,以便可以以非const方式传递给C函数.
const int slot_size = 20;
std::vector<char> vbuffer;
Run Code Online (Sandbox Code Playgroud)
此函数接受一个字符串,复制到所需大小的临时缓冲区,然后将其复制到 vbuffer
void prepBuffer( const std::string& s)
{
std::vector<char> temp(slot_size);
std::copy(s.c_str(), s.c_str() + s.length() + 1, temp.begin());
vbuffer.insert(vbuffer.end(), temp.begin(), temp.end());
}
Run Code Online (Sandbox Code Playgroud)
测试功能
int main()
{
vbuffer.reserve(60);
prepBuffer( "Argentina");
prepBuffer( "Herzegovina");
prepBuffer( "Zambia");
cout << &vbuffer[0] << endl;
cout << &vbuffer[20] << endl;
cout << &vbuffer[40] << endl;
}
Run Code Online (Sandbox Code Playgroud)
题.我的prepBuffer函数中有很多字符串复制.我正在寻找一种更好的方法来填充vbuffer最小的复制
编辑
插槽的大小在程序的其他地方确定.但是在编译时并不知道.
编辑
根据我接受的答案,我已经确定了这个版本
void prepBuffer(const std::string& s)
{
assert(s.size() < slot_size );
vbuffer.insert(vbuffer.end(), s.begin(), s.end());
vbuffer.insert(vbuffer.end(), …Run Code Online (Sandbox Code Playgroud) 下面的函数测试输入字符串是否包含double.
bool is_double(const std::string& str)
{
char* p;
strtod(str.c_str(), &p);
return *p == 0;
}
Run Code Online (Sandbox Code Playgroud)
函数返回后指针p会发生什么?
假设我有一个像这样的宽字符串
std::wstring s(L"Stack Over Flow");
Run Code Online (Sandbox Code Playgroud)
我想要复制到宽字符std::vector<wchar_t>(一个空终止字符串)的向量中使用std::copy
以下方法似乎工作
第一
std::vector<wchar_t> c( s.size() + 1 );
std::copy(s.c_str(), s.c_str() + s.length() + 1, c.begin());
wprintf( L"%s\n",&c[0] );
Run Code Online (Sandbox Code Playgroud)
第二
std::vector<wchar_t> d( s.size() + sizeof(wchar_t));
std::copy(s.c_str(), s.c_str() + s.length() + sizeof(wchar_t), d.begin());
wprintf( L"%s\n",&d[0] );
Run Code Online (Sandbox Code Playgroud)
但我认为第一个应该失败,因为我没有为结束的空字符分配正确的大小.我错过了什么?
编辑
不,我不想这样
std::vector<wchar_t> c(s.begin(), s.end()); <br>
Run Code Online (Sandbox Code Playgroud)
因为我正在调整现有缓冲区的大小
编辑
通过更改用例(使用类似C的API打印)我可以看到第二个版本可能是正确的.
首先 按预期打印Stack Over Flow????????
第二次打印Stack Over Flow
我想获取(或从源代码构建)静态链接到 Windows 上的 crt 的 OpenGL 库。
我不希望我的可执行文件需要 OPENGL32.dll。
我的编译器是 Visual C++ 9。
我从哪开始呢?OpenGL 网站将我引导到这个 wiki http://www.opengl.org/wiki/Getting_started 但是那个 wiki 告诉我“在所有三个主要的桌面平台(Linux、MacOS X 和 Windows)中,OpenGL 或多或少都带有系统”。我在 Windows 上。这个说法是真的吗。我如何验证这一点?