Мое понимание заключается в том, что строка
является членом СТД
пространство имен, так почему происходит следующее?
#include <iostream>
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);
cin.get();
return 0;
}
Каждый раз, когда программа запускается, mystring совсем
принты, казалось бы, случайная строка из 3 символов, например, в выше выходного.
[1]: http://www.amazon.ca/C-Primer-Plus-Stephen-Prata/dp/0321776402/ref=sr_1_1?ie=UTF8&=1338670903& qid;sr=8-1
Это'ы компиляции, потому что е
это'т типа безопасным, поскольку он использует переменным количеством аргументов в c чувством<суп>1</суп>. е
не вариант СТД::строка
, только с-строкой. Используя что-то другое в место того, что его ожидает, наверняка выиграл'т дать вам результаты, которые вы хотите. Это'ы на самом деле неопределенное поведение, так что все может случиться.
Самый простой способ исправить это, поскольку вы'вновь на C++, печатает он нормально с с std::соиь
, с СТД::строка
поддерживает, что через перегрузку операторов:
std::cout << "Follow this command: " << myString;
Если по каким-то причинам вам необходимо извлечь строку в стиле C, вы можете использовать метод c_str()
от СТД::строка
получить `константный тип char*, что является завершающим нулем. Используя Ваш пример:
#include <iostream>
#include <string>
#include <stdio.h>
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;
}
Если вы хотите, чтобы функция, как Е
, но типа безопасно, посмотрите на шаблоны с переменным числом аргументов (в C++11, поддерживается всеми основными компиляторами состоянию на MSVC12). Вы можете найти пример одного here. Там's ничего я не знаю, как реализовано в стандартной библиотеке, но может быть в Boost, в частности, импульс::формат
.
[1]: это значит, что вы можете передать любое количество аргументов, а функция зависит от вас, чтобы сказать это число и типы аргументов. В случае Е
, что означает строку с закодированной на нем информацией типа %Д
смысл инт
. Если вы лежите о типе или число, то функция имеет стандартный способ познания, хотя некоторые компиляторы имеют возможность проверить и давать предупреждения, когда вы лежите.
Пожалуйста, Дон'т использовать функции printf(" У%Ы" и, your_string.c_str());`
Используйте соиь << your_string;вместо этого. Короткий, простой и безопасной. В самом деле, когда вы'вновь пишет на С++, вы обычно хотите, чтобы избежать
е` полностью ... это'ы остатки от C, что'ы редко необходимы или полезны в C++.
По состоянию на почему вы должны использовать суда
вместо Е
, для этого есть множество причин. Здесь'ы на выборку из нескольких наиболее очевидных:
е
это't тип-безопасный. Если тип вы проходите отличается от приведенной в спецификатор преобразования, е
будут пытаться использовать все, что он находит в стеке, как если бы это были указанного типа, давая неопределенное поведение. Некоторые компиляторы могут предупредить об этом при некоторых обстоятельствах, но некоторые компиляторы могут'т/выиграл'т на все, и никто не может при любых обстоятельствах.е
это'т расширяемым. Можно передавать только примитивные типы к нему. Набор преобразования спецификаторов он понимает, жестко в ее реализации, и там's нет путь для вас, чтобы добавить дополнительные/другие. Большинство хорошо написанных языке C++ должны использовать эти типы в первую очередь для реализации типов, ориентированных на решаемой задачи.СТД::язык Лок (назальный;); с std::соиь.охотник(Лок);
с std::соиь << 123456.78;
Безымянный язык (в "" в) выбирает язык в зависимости от пользователя'ы конфигурации. Поэтому на моей машине (настроен на американский английский), это выводит как 123,456.78. Для кого-то, кто имеет их компьютер настроен на (допустим) Германии, его бы распечатать что-то вроде
123.456,78. Для кого-то он настроен для Индии, это будет распечатать как 1,23,456.78
(и конечно есть много других). С Е
я получаю ровно один результат: 123456.78
. Это согласуется, но это'ы последовательно неправильный абсолютно для всех и каждого. По сути, единственный способ обойти это, чтобы сделать форматирование отдельно, потом передать результат в виде строки е
, потому что Е
себя просто не сделать работу правильно.
4. Хотя они'строки отформатировать довольно компактный, Е
может быть совершенно нечитаемым. Даже среди программистов, которые используют е
практически каждый день, я'd не думаю, по крайней мере 99% должны искать вещи, чтобы быть уверенным, что #
в %#Х
означает, и как это отличается от того, что #
в %#Е
означает (и да, они имеют в виду совершенно разные вещи).
используйте mystring совсем.c_str()
если вы хотите, ч-как строка (`константный тип char*), чтобы использовать с printf
спасибо
Printf является на самом деле очень хорошо использовать, если размер имеет значение. То есть, если вы запускаете программу, где память является проблемой, то в printf на самом деле очень хорош и при решении оценщик. Суда по существу сдвигает биты, чтобы освободить место для струны, А Е просто принимает какие-то параметры и выводит ее на экран. Если вы были составить простой привет мировая программа, Е бы быть в состоянии скомпилировать его в меньше, чем 60, 000 бит в отличие от суда, на это потребуется более 1 миллиона бит для компиляции.
Для вашей ситуации, ID предложить с помощью функции cout просто потому, что это гораздо более удобным в использовании. Хотя, я утверждаю, что Е что-то хорошо знать.
Основная причина наверное в том, что в строку C++ - это структура, которая включает в себя текущий-значение длины, не только последовательность символов, заканчивающаяся 0 байт. Printf и его родственники надеются найти такую последовательность, не структуру, и поэтому запутаться строк C++.
Говоря за себя, я считаю, что Е имеет место, что может'т быть легко заполнен с++ синтаксические особенности, как структуры таблиц в HTML имеют место, что может'т быть легко заполнены ДИВС. Как Дикстра писал позже о Гото, он не'т собираюсь начинать религия, и на самом деле было спорить против того, чтобы использовать его в качестве костыля, чтобы компенсировать плохо спроектированного кода.
Было бы совсем неплохо, если проект GNU хотел бы добавить, семье е от расширения++.
е
принимает переменное число аргументов. Те могут только простых данных (под) типов. Код, который передает ничего, кроме стручка е
только компилируется, потому что компилятор предполагает, что вы получили свой формат. %S
означает, что соответствующий аргумент должен быть указателем на чара
. В вашем случае это СТД::строка
не константный тип char*
. е
не знаю, что это за тип аргументации потерян и должен быть восстановлен с параметром формат. При повороте, что СТД::строка аргументв
как const char*` и результирующий указатель будет указывать в некоторых несущественных области памяти вместо желаемого строку c. По этой причине ваш код выводит кракозябры.
В то время как Е
- это отличный выбор для печати форматированного текста]1, (особенно если вы собираетесь иметь отступы), это может быть опасно, если вы не'т включить предупреждения компилятора. Всегда включить предупреждения потому что тогда таких ошибок легко избежать. Нет никаких причин, чтобы использовать неуклюжий СТД::механизм функции cout
если е
семья может сделать ту же задачу гораздо быстрее и красивее, кстати. Просто убедитесь, что вы включили все предупреждения (-стены -Wextra
) и вам будет хорошо. В случае, если вы используете реализацию собственных пользовательских е
вы должны указать его с помощью механизмаатрибут`, что позволяет компилятору проверить строку формата на параметры.