【发布时间】:2012-03-16 20:02:09
【问题描述】:
我有一个 Visual Studio 2008 C++ 项目,我需要将字符串解析为 c 样式字符数组的结构。最优雅/最有效的方法是什么?
这是我当前(有效)的解决方案:
struct Foo {
char a[ MAX_A ];
char b[ MAX_B ];
char c[ MAX_C ];
char d[ MAX_D ];
};
Func( const Foo& foo );
std::string input = "abcd@efgh@ijkl@mnop";
std::vector< std::string > parsed;
boost::split( parsed, input, boost::is_any_of( "@" ) );
Foo foo = { 0 };
parsed[ 1 ].copy( foo.a, MAX_A );
parsed[ 2 ].copy( foo.b, MAX_B );
parsed[ 3 ].copy( foo.c, MAX_C );
parsed[ 4 ].copy( foo.d, MAX_D );
Func( foo );
【问题讨论】:
-
我看不出这个解决方案有什么问题,除了如果你会经常添加到你的结构中,那么它可能是维护的痛苦,因为分配给 foo.a、foo.b 等没有不遵循 DRY 原则。你认为你会经常添加到这个结构中吗?
-
我不认为我会经常添加它。我最关心的是我复制这些字符串的次数。有没有办法减少这种情况?
-
我不这么认为。如果您要复制一个字符串,您可以简单地将其复制到结构的起始地址。在您的情况下,它会起作用,因为您的结构中只有字符并且它们是单字节对齐的。虽然我不建议这样做,因为我认为它很难看。但是无论如何你都不能这样做,因为你是从向量复制的,所以你必须一个一个地引用每个字符串。我认为你有什么是好的。
-
你有没有考虑把整个东西放到一个单独的函数中,例如
Foo makeFooFromString(std::string &input)