Existe uma maneira de usar o cin.getLine () sem precisar definir um tamanho de matriz de char antes da mão?
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?
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);
}