Como posso substituir a análise de string no estilo C pelo código compatível com as diretrizes do núcleo C ++?

Big Temp

Veja, por exemplo, estes dois fragmentos de código:

//...
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);
//...

Para este tipo de dados

(...)
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
(...)

eles funcionam e funcionam suficientemente rápido. Eles também geram avisos como:

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).

Como posso substituir a combinação aritmética strstr / ponteiro por algo que faria seu trabalho comparativamente rápido e não gerasse tais avisos? Eu tentei passar por questões semelhantes relacionadas a conversões std::string-para- floatconversões, mas eles usaram std::stringstream, o que é muito lento, ou presumiram que a string em questão continha apenas um valor.

parktomatomi

editado para alterações após ativar o verificador de diretrizes básicas

Eu tentei usar std::from_chars. Curiosidade: ainda não funciona no gcc ou clang para valores de ponto flutuante! Isso ... pode justificar não usá-lo até que o recurso esteja maduro.

Coisas para calar o verificador de diretrizes:

  • gsl::até o código da trapaça para aritmética de ponteiro. Nenhum aviso
  • O verificador de vida é meio burro. Ele não sabe que um literal de sting envolvido por um string_viewainda tem vida infinita, mas não sinaliza se você usar literais de exibição de string ("" sv).
  • Ainda usando string::findpara pesquisar e, em seguida, adicionando a posição astring::data()
  • Eu recomendei a indexação em vez da aritmética de ponteiro antes, mas a análise também não gosta disso.
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);
}

https://godbolt.org/z/F9j7FA

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    UITextView não está exibindo texto longo

  3. 3

    Dependência circular de diálogo personalizado

  4. 4

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  5. 5

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  6. 6

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  7. 7

    Setas rotuladas horizontais apontando para uma linha vertical

  8. 8

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  9. 9

    Definir um clipe em uma trama nascida no mar

  10. 10

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  11. 11

    Como dinamizar um Dataframe do pandas em Python?

  12. 12

    regex para destacar novos caracteres de linha no início e no fim

  13. 13

    Why isn't my C# .Net Core Rest API route finding my method?

  14. 14

    Como obter a entrada de trás de diálogo em treeview pyqt5 python 3

  15. 15

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  16. 16

    How to create dynamic navigation menu select from database using Codeigniter?

  17. 17

    Como recuperar parâmetros de entrada usando C #?

  18. 18

    Changing long, lat values of Polygon coordinates in python

  19. 19

    Livros sobre criptografia do muito básico ao muito avançado

  20. 20

    Método \ "POST \" não permitido no framework Django rest com ações extras & ModelViewset

  21. 21

    Pesquisa classificada, conte números abaixo do valor desejado

quentelabel

Arquivo