Это компиляции, потому что printf
не типобезопасен, так как он использует переменные аргументы в смысле C . printf
не имеет опции для std::string
, только строки стиля C. Использование чего-то еще вместо того, что он ожидает, определенно не даст вам желаемых результатов. На самом деле это неопределенное поведение, поэтому может произойти что угодно.
Самый простой способ исправить это, так как вы используете C++, печатает это нормально с std::cout
, так как std::string
поддерживает, что через перегрузкой операторов:
std::cout << "Follow this command: " << myString;
Если по какой-то причине вам нужно извлечь строка стиля C, вы можете использовать метод c_str()
для std::string
, чтобы получить номер const char *
с нулевым завершением. Используя ваш пример:
#include <iostream>
#include <string>
int main()
{
using namespace std;
string myString = "Press ENTER to quit program!";
cout << "Come up and C++ me some time." << endl;
printf("Follow this command: %s", myString.c_str()); //note the use of c_str
cin.get();
return 0;
}
Если вы хотите функцию, как printf
, но типобезопасны, смотрите в шаблоны (переменное числа C++ 11, поддерживаемых на все основные компилятор из MSVC12). Вы можете найти пример одного из here. Я ничего не знаю о реализованных в стандартной библиотеке, но может быть в Boost, в частности boost::format
.
[1]: Это означает, что вы можете передать любое количество аргументов, но функция зависит от вас, чтобы сказать это количество и типы этих аргументов. В случае printf
это означает строку с кодированной информацией типа, например %d
, что означает int
. Если вы лжете о типе или номере, функция не имеет стандартного способа узнать, хотя некоторые компиляторы имеют возможность проверять и давать предупреждения, когда вы лжете.
Просто, чтобы вы знали, многие люди [критикуют] (http://stackoverflow.com/questions/5250596/how-should-i-undo-damage-caused-by-reading-c-primer-plus) эта книга. Что я могу понять, потому что о объектно-ориентированном программировании мало, но я не думаю, что это так плохо, как люди утверждают. –
ouf! хорошо, хорошо помнить об этом, пока я прохожу через книгу. Я уверен, что это не будет единственная книга на C++, которую я буду читать в течение следующего года или около того, поэтому я надеюсь, что это не слишком много damange :) – TheDarkIn1978
Использование самого высокого предупреждения о компиляторе ответит на ваш вопрос - ** когда ** компиляция с gcc. Как MSVC справляется с этим - я не знаю. –