получил <null>используя printf со строкой - PullRequest
0 голосов
/ 29 марта 2012

При использовании printf для строки, я получил:

string key = "123";
printf("Value is %s \n", key);

// вывод: Значение равно

Но если я сделаю это так:

string key = "123";
printf("Value is: ");
printf(key.c_str());

тогда я получаю:

// вывод: значение 123

Итак, что я сделал не так с

printf% s

Заранее спасибо.

Ответы [ 6 ]

4 голосов
/ 29 марта 2012

std::string - это класс C ++. Так что это не работает, потому что:

  1. printf - это чистая функция C, которая знает, как обращаться с примитивными типами (int, double, char * и т.
  2. printf - это переменная функция . Передача типа класса в функцию с переменными значениями приводит к неопределенному поведению . 1

Если вы хотите отобразить строку, используйте std::cout:

std::cout << key << "\n";

Если вы просто должны использовать printf, то это должно работать:

printf("%s\n", key.c_str());

c_str является функцией-членом, которая возвращает строку в стиле C (то есть a const char *). Имейте в виду, что у него есть некоторые ограничения; Вы не можете изменить или удалить объект string между вызовом c_str() и использованием результата:

const char *p = key.c_str();
key = "something else";
printf("%s\n", p);  // Undefined behaviour


1. Или, возможно, определяется реализацией , я не помню. В любом случае, это не закончится хорошо.
3 голосов
/ 29 марта 2012

Маркер %s говорит printf ожидать нулевого завершения const char*, и вы передаете ему std::string.

Правильный путь будет:

printf("Value is %s \n", key.c_str());

C ++ мог бы использовать std::cout.

2 голосов
/ 29 марта 2012

Стиль C будет

printf("Value is %s \n", key.c_str()); // printf does need a nullterminated char*

Стиль C ++ будет

cout << "Value is %s " << key << endl; // cout can use std::string directly
2 голосов
/ 29 марта 2012

printf является функцией библиотеки C и требует C "string" (char *) для формата% s.Вы уже обнаружили, что вы можете сделать cppstring.c_str (), чтобы получить это.Также смотрите этот вопрос .

1 голос
/ 29 марта 2012

В дополнение к другим ответам: printf - это переменная функция, и передача объекта типа класса, который не является POD, является неопределенным поведением, а std::string является типом класса, который не является POD. Неопределенное поведение означает, конечно, что все может произойти, но это легко обнаружить, и хороший компилятор по крайней мере предупредит об ошибке.

0 голосов
/ 29 марта 2012

cout << строка может работать, поскольку класс String перегружен оператор "<<", поэтому printf () определенно не может работать! </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...