2010-08-24 3 views
1

Почему следующий код не работает?Проблема с конкатенацией C++

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

Он должен сцепить «.txt» на конце любой имя_файла введенному

Кроме того, когда я пытаюсь скомпилировать его (с г ++) это сообщение об ошибке

alt text

+4

Многие люди говорят, чтобы использовать 'зЬй :: strings' вместо символьных массивов. В дополнение к тому, что 'std :: strings' проще в использовании благодаря встроенной поддержке таких вещей, как конкатенация, они также более безопасны в использовании, так как легко вводить (использовать) ошибки при использовании массивов символов. Например, что, если пользователь вводит имя файла длиной более 19 (1 символ используется для символов с нулевым терминатором)? – Brian

ответ

15

Используйте двойные кавычки вместо одиночных кавычек.

strcat(filename, ".txt"); 

В C++, одиночные кавычки обозначают одного характер, двойные кавычки обозначают последовательности символов (строка). Добавляя в L до буквального означает, что он использует широкий набор символов:

".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" 

Обычная строка символов, как правило, ASCII, в то время как широкая строка символов, как правило, некоторая форма кодирования Unicode (хотя язык C++ не гарантируйте это - проверьте свою документацию компилятора).

Предупреждение Компилятор упоминает int потому, что C++ стандарт (2.13.2/1) говорит, что символьные литералы, которые содержат больше, чем один char на самом деле имеет тип int, который имеет определенное значение реализации.

Если вы используете C++, хотя, вы лучше использовать std::string вместо этого, в качестве Mark B предложил:

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

Вау ... Так просто ... –

+2

Правило № 1: Скомпилировать на высоких уровнях предупреждения (http://www.gotw.ca/publications/c++cs.htm). Хороший улов; это легко сделать (и пропустить). – gregg

+1

Также обратите внимание, что строка заканчивается символом '\ 0' и как таковой на 1 символ дольше, чем они выглядят. –

7

" и ' означают разные вещи в C++. Единая кавычка означает символ, а двойная кавычка означает C-строку. Вы должны использовать ".txt".

Учитывая, что это C++, однако, не используйте C-стиль char[] вообще: Используйте std::string вместо:

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

Ahh, я привык к PHP ... Начал C++ несколько дней назад –

+0

@Mark: Забудьте, что вы знаете какие-либо языки. Вам нужно получить [книгу] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) и начать с самого начала. – GManNickG

+2

Если материал, который вы читаете, предлагает использовать массив символов и 'strcat' с использованием' std :: string', вы, вероятно, читаете учебник C или плохо написанный учебник по C++. – Brian

2

strcat второй аргумент использует строку (двойные кавычки). Вы используете одиночные кавычки (символ == целое)

Ahmed

Смежные вопросы