![](/img/trans.png)
[英]How to find (and replace) all old C-style data type casts in my C++ source code?
[英]How can I replace the C-style string parsing with C++ core guideline-compliant code?
以這兩個代碼片段為例:
//...
file_string = strstr(file_string, "\nv ");
while (file_string = strstr(file_string, "v ")) {
vec::vec3<float> buffer = { 0.0f };
file_string += strlen("v ");
file_string = std::from_chars(file_string, file_string_end, buffer.x).ptr;
file_string++;
file_string = std::from_chars(file_string, file_string_end, buffer.y).ptr;
file_string++;
file_string = std::from_chars(file_string, file_string_end, buffer.z).ptr;
file_string++;
vcoords.push_back(std::move(buffer));
}
//...
//...
while (file_string = strstr(file_string, "v ")) {
size++;
file_string++;
}
vcoords.reserve(size);
//...
對於此類數據
(...)
v 1.000000 1.000000 -1.000000
v 1.000000 -1.000000 -1.000000
v 1.000000 1.000000 1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 1.000000 -1.000000
(...)
他們工作並且他們工作得足夠快。 它們還會生成警告,例如:
C26481: Don't use pointer arithmetic.
C26486: Don't pass a pointer that may be invalid to a function. Parameter 0 'file_string' in call to 'strstr' may be invalid (lifetime.3).
如何將 strstr/pointer 算術組合替換為可以相當快地完成其工作並且不會產生此類警告的東西? 我嘗試解決與std::string
到float
轉換相關的類似問題,但他們要么使用了非常慢的std::stringstream
,要么假設所討論的字符串只包含一個值。
啟用核心指南檢查器后編輯更改
我嘗試使用std::from_chars
。 有趣的事實:它不適用於 gcc 或 clang 浮點值。 那......可能保證在功能成熟之前不要使用它。
關閉指南檢查器的事情:
gsl::at
是指針運算的作弊碼。 沒有警告string_view
包裝的字符串文字仍然具有無限的生命周期,但如果您使用字符串視圖文字 (""sv),它不會標記。string::find
進行搜索,然后將 position 添加到string::data()
using namespace std::literals;
const std::string file_string = "\n"
"v 1.000000 1.000000 -1.000000\n"
"v 1.000000 -1.000000 -1.000000\n"
"v 1.000000 1.000000 1.000000\n";
const auto tag = "v "sv;
const char* file_string_end = &gsl::at(file_string, file_string.size());
std::vector<vec::vec3<float>> vcoords;
std::string::size_type pos = 0;
while ((pos = file_string.find(tag, pos)) != std::string::npos) {
vec::vec3<float> buffer = { 0.0f };
auto [x_ptr, x_ec] = std::from_chars(
&gsl::at(file_string, pos + tag.size()),
file_string_end,
buffer.x);
if (x_ec != std::errc()) {
throw std::runtime_error("bad x");
}
std::string_view x_view(x_ptr);
auto [y_ptr, y_ec] = std::from_chars(
&gsl::at(x_view, 1),
file_string_end,
buffer.y);
if (y_ec != std::errc()) {
throw std::runtime_error("bad y");
}
std::string_view y_view(y_ptr);
auto [z_ptr, z_ec] = std::from_chars(
&gsl::at(y_view, 1),
file_string_end,
buffer.z);
if (z_ec != std::errc()) {
throw std::runtime_error("bad z");
}
vcoords.push_back(buffer);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.