2010-08-24 4 views
1

Pourquoi le code suivant ne fonctionne-t-il pas?Problème de chaîne de concaténation C++

#include <iostream> 
#include <string> 
int main(){ 
    char filename[20]; 
    cout << "Type in the filename: "; 
    cin >> filename; 
    strcat(filename, '.txt'); 
    cout << filename; 
} 

Il devrait concaténer « txt » à la fin de ce que le nom de fichier est entré

Aussi, lorsque je tente de le compiler (avec g ++) tel est le message d'erreur

alt text

+4

Beaucoup de gens disent utiliser 'std :: strings' au lieu de tableaux de caractères. En plus du fait que 'std :: strings' est plus facile à utiliser pour prendre en charge des choses comme la concaténation, ils sont aussi plus sûrs à utiliser, car il est facile d'introduire des bogues (exploitables) lors de l'utilisation de tableaux de caractères. Par exemple, que se passe-t-il si l'utilisateur entre un nom de fichier de plus de 19 caractères (1 caractère est utilisé pour les caractères de terminaison nulle)? – Brian

Répondre

15

Utilisez des guillemets doubles au lieu de guillemets simples.

strcat(filename, ".txt"); 

En C++, guillemets simples indiquent un seul caractère , guillemets doubles indiquent une séquence de caractères(une chaîne). L'ajout d'un L avant le littéral indique qu'il utilise le jeu de caractères larges:

".txt" // <--- ordinary string literal, type "array of const chars" 
L".txt" // <--- wide string literal, type "array of const wchar_ts" 
'a'  // <--- single ordinary character, type "char" 
L'a' // <--- single wide character, type "wchar_t" 

La chaîne ordinaire littérale est généralement ASCII, alors que la grande chaîne littérale est généralement une certaine forme de codage Unicode (bien que le langage C++ ne garantissez ceci - vérifiez la documentation de votre compilateur).

L'avertissement du compilateur mentionne int parce que la norme C++ (2.13.2/1) indique que les littéraux de caractères qui contiennent plus d'un char a fait le type int, qui a une valeur définie de mise en œuvre.

Si vous utilisez C++ bien, vous êtes mieux d'utiliser à la place std::string, comme Mark B a suggéré:

#include <iostream> 
#include <string> 
int main(){ 
    std::string filename; 
    std::cout << "Type in the filename: "; 
    std::cin >> filename; 
    filename += ".txt"; 
    std::cout << filename; 
} 
+0

Wow ... Tellement simple ... –

+2

Règle numéro 1: Compiler proprement à des niveaux élevés d'avertissement (http://www.gotw.ca/publications/c++cs.htm). Bonne prise; c'est une erreur facile à faire (et manquer). – gregg

+1

Notez également que les chaînes sont terminées par '\ 0' et qu'elles sont donc 1 caractère plus long qu'elles ne le paraissent. –

7

" et ' signifie différentes choses en C++. Le guillemet simple signifie un caractère, tandis que le guillemet double signifie un C-string. Vous devez utiliser ".txt".

Étant donné que c'est C++ cependant, ne pas utiliser du tout style C char[]: Utilisez std::string à la place:

#include <iostream> 
#include <string> 
int main(){ 
    std::string filename; 
    cout << "Type in the filename: "; 
    cin >> filename; 
    filename += ".txt"; 
    cout << filename; 
} 
+0

Ahh, je suis habitué à PHP ... Commencé C++ il ya quelques jours –

+0

@Mark: Oubliez vous connaître toutes les langues. Vous devez obtenir [un livre] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) et recommencer depuis le début. – GManNickG

+2

Si le matériel que vous lisez suggère d'utiliser un tableau de caractères et que 'strcat' utilise' std :: string', vous lisez probablement un tutoriel C ou un tutoriel C++ mal écrit. – Brian

2

strcat deuxième argument utilise une chaîne (entre guillemets). Vous utilisez des guillemets simples (caractère == entier)

Ahmed