Вопрос по c++, string – printf с помощью std :: string?

133

Я понимаю, чтоstring является членомstd пространство имен, так почему происходит следующее?

#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;
}

enter image description here

Каждый раз, когда программа запускается,myString печатает, казалось бы, случайную строку из 3 символов, например, в выводе выше.

Error: User Rate Limit ExceededwhenError: User Rate Limit Exceeded Al Bundy
Error: User Rate Limit Exceeded TheDarkIn1978
Error: User Rate Limit ExceededcriticizeError: User Rate Limit Exceeded Jesse Good

Ваш Ответ

7   ответов
6

std::printf("Follow this command: %s", myString.c_str());
24

Error: User Rate Limit Exceeded

2

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

1

printfError: User Rate Limit ExceededprintfError: User Rate Limit Exceeded%sError: User Rate Limit ExceededcharError: User Rate Limit Exceededstd::stringError: User Rate Limit Exceededconst char*. printfError: User Rate Limit Exceededstd::stringError: User Rate Limit Exceededconst char*Error: User Rate Limit Exceeded

Error: User Rate Limit ExceededprintfError: User Rate Limit ExceededError: User Rate Limit ExceededError: User Rate Limit ExceededAlways enable warningsError: User Rate Limit Exceededstd::coutError: User Rate Limit ExceededprintfError: User Rate Limit Exceeded-Wall -WextraError: User Rate Limit ExceededprintfError: User Rate Limit Exceeded__attribute__Error: User Rate Limit ExceededError: User Rate Limit Exceeded.

40

Error: User Rate Limit Exceededprintf("%s", your_string.c_str());

Error: User Rate Limit Exceededcout << your_string;Error: User Rate Limit ExceededprintfError: User Rate Limit Exceeded

Error: User Rate Limit ExceededwhyError: User Rate Limit ExceededcoutError: User Rate Limit ExceededprintfError: User Rate Limit Exceeded

  1. As the question shows, printf isn't type-safe. If the type you pass differs from that given in the conversion specifier, printf will try to use whatever it finds on the stack as if it were the specified type, giving undefined behavior. Some compilers can warn about this under some circumstances, but some compilers can't/won't at all, and none can under all circumstances.
  2. printf isn't extensible. You can only pass primitive types to it. The set of conversion specifiers it understands is hard-coded in its implementation, and there's no way for you to add more/others. Most well-written C++ should use these types primarily to implement types oriented toward the problem being solved.
  3. It makes decent formatting much more difficult. For an obvious example, when you're printing numbers for people to read, you typically want to insert thousands separators every few digits. The exact number of digits and the characters used as separators varies, but cout has that covered as well. For example:

    std::locale loc("");
    std::cout.imbue(loc);
    
    std::cout << 123456.78;
    

    The nameless locale (the "") picks a locale based on the user's configuration. Therefore, on my machine (configured for US English) this prints out as 123,456.78. For somebody who has their computer configured for (say) Germany, it would print out something like 123.456,78. For somebody with it configured for India, it would print out as 1,23,456.78 (and of course there are many others). With printf I get exactly one result: 123456.78. It is consistent, but it's consistently wrong for everybody everywhere. Essentially the only way to work around it is to do the formatting separately, then pass the result as a string to printf, because printf itself simply will not do the job correctly.

  4. Although they're quite compact, printf format strings can be quite unreadable. Even among C programmers who use printf virtually every day, I'd guess at least 99% would need to look things up to be sure what the # in %#x means, and how that differs from what the # in %#f means (and yes, they mean entirely different things).
@ TheDarkIn1978: Вы, вероятно, забыли#include <string>, В заголовках VC ++ есть некоторые странности, которые позволят вам определить строку, но не отправлять ееcoutбез учета<string> заголовок.
ОК, извините за быстрый комментарий. Тем не менее, printf довольно удобен для отладки, и потоки, хотя и гораздо более мощные, имеют недостаток, заключающийся в том, что код не дает никакого представления о реальном выводе. Для форматированного вывода printf по-прежнему является жизнеспособной альтернативой, и, к сожалению, обе системы не могут лучше взаимодействовать. Просто мое мнение, конечно.
Типичное высокомерие C ++. Если printf существует, почему бы не использовать его?
@ Джерри: Просто хочу отметить, что использование printf НАМНОГО быстрее, чем использование cout при работе с большими данными. Поэтому, пожалуйста, не говорите, что это бесполезно: D
@Programmer: см.stackoverflow.com/questions/12044357/…, Резюме: в большинстве случаевcout медленнее, потому что вы использовалиstd::endl где вы не должны ".
201

Error: User Rate Limit ExceededprintfError: User Rate Limit Exceeded1. printfError: User Rate Limit Exceededstd::stringError: User Rate Limit Exceeded

Error: User Rate Limit Exceededstd::coutError: User Rate Limit Exceededstd::stringError: User Rate Limit Exceeded

std::cout << "Follow this command: " << myString;

Error: User Rate Limit Exceededc_str()Error: User Rate Limit Exceededstd::stringError: User Rate Limit Exceededconst char *Error: User Rate Limit Exceeded

#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;
}

Error: User Rate Limit ExceededprintfError: User Rate Limit ExceededError: User Rate Limit ExceededError: User Rate Limit Exceededboost::format.


Error: User Rate Limit ExceededprintfError: User Rate Limit Exceeded%dError: User Rate Limit ExceededintError: User Rate Limit Exceeded

@ MooingDuck, хорошая мысль. Это в ответе Джерри, но, будучи принятым ответом, это то, что люди видят, и они могут уйти, прежде чем увидят других. Я добавил эту опцию в качестве первого увиденного решения и рекомендованного.
нет упоминаний об использованииcout для строки также?
1

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Похожие вопросы