2017-10-06 10 views
0

J'exécuter ce test:google tests: impossible de créer une chaîne à partir de char array?

TEST_F(CHAR_TESTS, wtf){ 
    char letter[3] = {'A','B','C'}; 
    char types[2] = {'o','s'}; 
    char tmp[3]; 
    for(int i=0;i<3;i++){ 
    for(int j=0;j<3;j++){ 
     for(int k=0;k<2;k++){ 
     tmp[0]=letter[i]; 
     tmp[1]=letter[j]; 
     tmp[2]=types[k]; 
     std::string combination(tmp); 
     std::cout << combination << std::endl; 
     } 
    } 
    } 
} 

Pour une raison quelconque, cette page Imprimer:

AAo~ 
AAs~ 
ABo~ 
ABs~ 
ACo~ 
ACs~ 
BAo~ 
BAs~ 
BBo~ 
BBs~ 
BCo~ 
BCs~ 
CAo~ 
CAs~ 
CBo~ 
CBs~ 
CCo~ 
CCs~ 

Je ne pense pas que ce soit un problème avec l'impression elle-même, comme je l'ai fini par le faire après avoir remarqué certains tests comparant les chaînes générées à partir de réseaux de char ne passaient pas, et je ne pouvais pas comprendre pourquoi. Donc, il semble que les chaînes de "combinaison" ne finissent pas par avoir le contenu attendu.

Le même code dans un exécutable "normal" (pas un gtest) imprime ce qui est attendu (les 3 caractères sans les caractères supplémentaires étranges).

Répondre

5

Malheureusement std::stringdoes not have a constructor qui prend une référence à tableau de char. Vous finissez donc par appeler le constructeur const char*, et celui-ci nécessite que le pointeur pointe vers le premier élément d'une chaîne terminée par un caractère nul. Vos tableaux de char ne sont pas à terminaison nulle, donc vous finissez avec undefined comportement.

Vous devez terminer par tmp, ce que vous pouvez faire en le déclarant avec un caractère supplémentaire et en le définissant sur '\0'. Vous pouvez réaliser que, comme ce

char tmp[4] = {}; 
+0

Ou 'char tmp [4] =" ";' –

+0

putain, je viens de lire ceci un peu trop vite: https://stackoverflow.com/questions/8960087/how-to-convert-a-char-array -to-a-string: "la classe de chaîne a un constructeur qui prend une chaîne de caractères terminée par NULL", j'ai sauté la "partie terminée par NULL". – Vince

+1

Vous pouvez également utiliser la combinaison 'std :: string (std :: begin (tmp), std :: end (tmp));' – legalize

0

char tmp[3]; n'est pas utilisé nul fin char tmp[4] = {0};

1

Le constructeur dans std::string combination(tmp); ne fonctionne que si tmp est terminé NUL. Sinon, le constructeur ne peut pas trouver la longueur de la chaîne.

Cependant, vous pouvez aider std::string en fournissant explicitement la taille du tampon:

std::string combination(tmp, sizeof(tmp)); 

Ce constructeur est primarilly destiné à construire un std::string d'une partie d'une chaîne C-style, mais fonctionne aussi si on leur donne la pleine longueur.