Почему c_str () печатает строку дважды? - PullRequest
0 голосов
/ 03 февраля 2009

Итак ... когда я иду:

cout<<stringName<<endl;

Я получаю:

NT

Но когда я иду:

cout<<stringName.c_str()<<endl;

Я получаю:

NTNT

Почему?

Ответы [ 4 ]

9 голосов
/ 03 февраля 2009

Быстрый тест со следующим кодом:

#include <string>
#include <iostream>

using namespace std;

int main(void) {
    string str = "NT";
    cout << str.c_str() << endl;
    return 0;
}

создает один экземпляр NT, поэтому похоже, что у вас где-то есть еще один выходной вызов.

4 голосов
/ 03 февраля 2009

Традиционная строка C (доступная через char const*) имеет последовательность символов, оканчивающихся символом 0. (Не цифра 0, а фактическое нулевое значение, которое мы записываем как '\0'.) нет явной длины & mdash; поэтому различные строковые операции просто читают один символ за раз, пока он не достигнет '\0'.

C ++ std::string имеет явную длину в своей структуре.

Возможно ли, что схема памяти символов вашей строки выглядит следующим образом:

'NTNT\0'

но длина строки установлена ​​в 2?

Это приведет именно к такому поведению & mdash; манипулирование std::string напрямую приведет к тому, что он будет длиться всего два символа, но если вы выполняете традиционные операции C с использованием s.c_str(), это будет выглядеть как "NTNT".

Я не уверен, что махинации приведут вас в такое состояние, но оно точно будет соответствовать симптомам.

Один из способов попасть в это состояние - на самом деле записать в символы строки, что-то вроде: strcat((char *)s.c_str(), "NT")

2 голосов
/ 03 февраля 2009

Показать больше кода. Похоже, вы сделали cout << ealier и забыли, что сделали это. Что он печатает, если вы делаете cout<< "mofo" << stringName.c_str()<< "|||" << endl; Это говорит NTmofoNT|||? если так, то это может быть тем, что случилось;)

1 голос
/ 03 февраля 2009

Это не проблема с c_str(), но, вероятно, связана с какой-то другой аномалией в остальной части программы.

Создайте приложение "hello world", которое выполняет те же самые операции, и вы увидите, что оно отлично работает там.

...