Existe uma maneira de usar o cin.getLine () sem precisar definir um tamanho de matriz de char antes da mão?

StackOverflow https://stackoverflow.com/questions/2569662

  •  24-09-2019
  •  | 
  •  

Pergunta

Basicamente, minha tarefa é ter que classificar um monte de cordas de comprimento variável de ignorar o caso. Entendo que há uma função strcaSecmp () que compara o CStrings, mas não funciona em strings. No momento, estou usando getLine () para strings para que eu possa ler nas cordas uma linha de cada vez. Eu os adiciono a um vetor de strings e depois convertido em cStrings para cada chamada de strcasecmp (). Em vez de ter que converter cada string em um CString antes de comparar com o strcaSecmp (), eu queria saber se havia uma maneira de usar o cin.getLine () para CStrings sem ter um tamanho de matriz de char predefinido. Ou, a melhor solução seria apenas ler em string, converter em cstring, armazenar em vetor e depois classificar?

Foi útil?

Solução

Presumo "converter para cstring", você quer dizer usando o c_str() membro da string. Se for esse o caso, na maioria da implementação que não é realmente uma conversão, é apenas um acessador. A diferença só é importante se você estiver preocupado com o desempenho (o que parece que você é). Internamente, as cordas STD :: são (praticamente sempre, mas tecnicamente não precisam ser) representadas como um "cString". A classe cuida do gerenciamento do tamanho para você, mas é apenas um CString alocado dinamicamente por baixo.

Portanto, para responder diretamente: você deve especificar o tamanho da matriz ao usar o Cin.getLine. Se você não deseja especificar um tamanho, use GetLine e STD :: String. Não há nada de errado com essa abordagem.

Outras dicas

C ++ é bastante eficiente por si só. A menos que você tenha uma necessidade verdadeiramente comprovada de fazer o contrário, deixe -o fazer.

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
#include <cstring>

using namespace std;

bool cmp(string a, string b)
{
    return(strcasecmp(a.c_str(), b.c_str()) < 0);
}  


int main(int argc, char *argv[])
{
    vector<string> strArr;

    //too lazy to test with getline(cin, str);

    strArr.push_back("aaaaa");
    strArr.push_back("AAAAA");
    strArr.push_back("ababab");
    strArr.push_back("bababa");
    strArr.push_back("abcabc");
    strArr.push_back("cbacba");
    strArr.push_back("AbCdEf");
    strArr.push_back("aBcDeF");
    strArr.push_back("  whatever");

    sort(strArr.begin(), strArr.end(), cmp);

    copy(strArr.begin(), strArr.end(), ostream_iterator<string>(cout, " \n"));

    return(0);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top