Analisar uma sequência de strings separadas por vírgulas em C++

Jinku Hu 12 outubro 2023
  1. Use as funções std::string::find e std::string::erase para analisar a sequência de strings separadas por vírgulas em C++
  2. Use a função std::getline para analisar a sequência de strings separadas por vírgulas
Analisar uma sequência de strings separadas por vírgulas em C++

Este artigo demonstrará vários métodos sobre como analisar uma sequência de string separada por vírgulas em C++.

Use as funções std::string::find e std::string::erase para analisar a sequência de strings separadas por vírgulas em C++

O método std::find é uma função embutida da classe std::string e pode ser utilizado para encontrar a posição de uma determinada substring. É necessário um único argumento neste caso que denota a substring a ser encontrada. Qualquer variável de string de vários caracteres pode ser inicializada para ser passada como um argumento. Embora, no exemplo a seguir, declaremos uma única vírgula contendo string. Como o método find retorna a posição da substring e string::npos quando a substring não é encontrada, podemos colocar a expressão de comparação em um loop while que será executado até que a expressão seja avaliada como verdadeira.

Também armazenamos a string analisada em cada iteração no contêiner vetor. Em seguida, o método erase é chamado para excluir os caracteres anteriores e incluindo o primeiro delimitador de vírgula encontrado para continuar processando o mesmo objeto string na próxima iteração. Finalmente, enviamos os elementos armazenados no vetor para o fluxo cout.

#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text = "1,2,3,4,5,6,7,8,9,10";
  string delimiter = ",";
  vector<string> words{};

  size_t pos = 0;
  while ((pos = text.find(delimiter)) != string::npos) {
    words.push_back(text.substr(0, pos));
    text.erase(0, pos + delimiter.length());
  }
  for (const auto &str : words) {
    cout << str << endl;
  }

  return EXIT_SUCCESS;
}

Resultado:

1
2
3
4
5
6
7
8
9

Use a função std::getline para analisar a sequência de strings separadas por vírgulas

A solução anterior deixa de extrair o último número da seqüência separada por vírgulas. Portanto, pode ser melhor usar o método a seguir usando a função std::getline em vez de adicionar uma verificação condicional no exemplo de código anterior. getline lê caracteres de um determinado fluxo de entrada e os armazena em um objeto string. A função também leva um terceiro argumento opcional para especificar o delimitador pelo qual dividir a string de entrada. Também armazenamos as strings extraídas no contêiner std::vector em cada iteração para uso posterior.

#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::stringstream;
using std::vector;

int main() {
  string text = "1,2,3,4,5,6,7,8,9,10";
  char delimiter = ',';
  vector<string> words{};

  stringstream sstream(text);
  string word;
  while (std::getline(sstream, word, delimiter)) {
    words.push_back(word);
  }

  for (const auto &str : words) {
    cout << str << endl;
  }

  return EXIT_SUCCESS;
}

Resultado:

1
2
3
4
5
6
7
8
9
10
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C++ String