est-il un moyen d'utiliser cin.getline () sans avoir à définir une taille de tableau de caractères avant la main?

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

  •  24-09-2019
  •  | 
  •  

Question

En fait ma tâche est d'avoir à trier un tas de chaînes de longueur variable ignorant la casse. Je crois comprendre qu'il ya un strcasecmp () fonction qui compare CStrings, mais ne fonctionne pas sur les cordes. En ce moment, j'utilise getline () pour les chaînes, donc je peux lire dans les cordes d'une ligne à la fois. J'ajouter à un vecteur de chaînes, puis à convertir CStrings pour chaque appel de strcasecmp (). Au lieu d'avoir à convertir chaque chaîne en cstring avant de comparer avec strcasecmp (), je me demandais s'il y avait une façon que je pouvais utiliser cin.getline () pour CStrings sans avoir une taille de tableau de caractères prédéfini. Ou, serait la meilleure solution est de simplement lire dans la chaîne, se convertir à cstring, magasin dans le vecteur, puis trier?

Était-ce utile?

La solution

Je suppose que par « convertir en cstring » vous voulez dire en utilisant l'élément c_str() de chaîne. Si tel est le cas, dans la plupart mise en œuvre qui est pas vraiment une conversion, il est juste un accesseur. La différence est seulement important si vous êtes inquiet au sujet des performances (ce qui sonne comme vous êtes). En interne std :: Les chaînes sont (à peu près toujours, mais techniquement ne pas être) représentée comme un « cstring ». La classe prend en charge la gestion de sa taille pour vous, mais il est juste un cstring alloué dynamiquement en dessous.

Donc, pour répondre directement: Vous devez spécifier la taille du tableau lors de l'utilisation cin.getline. Si vous ne souhaitez pas spécifier une taille, puis utilisez getline et std :: string. Il n'y a rien de mal à cette approche.

Autres conseils

C ++ est assez efficace sur son propre. Sauf si vous avez un besoin vraiment prouvé de faire autrement, laissez-le faire son travail.

#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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top