Проблемы с пониманием того, как передать строку в C ++ - PullRequest
0 голосов
/ 30 марта 2020

Может ли кто-нибудь разбить правильный способ передачи строки в функцию, сделать так, чтобы эта функция помещала ее в вектор, а другая функция выводила содержимое вектора? Я уверен, что существует множество дубликатов, и я просмотрел их все (в основном) и до сих пор не смог применить ни одного из них к этой проблеме, или, по крайней мере, мне так кажется.

#include <cstdio>
#include <string>
#include <vector>

using namespace std;

static vector<string> added_messages;
static void addMessage(string message);
static void displayMessages();

int main()
{
    string message = "Testing 1 2 3";
    addMessage(message);
    //printf("%s\n", message);
    return 0;
}

void addMessage(string s)
{
    added_messages.push_back(s);
    //printf("%s\n", s);
}

void displayMessages()
{
    if (added_messages.size() != 0) {
        for (string i : added_messages)
            printf("%s\n", i);
    }
    added_messages.clear();
}

Это в основном выводит мусор: 4÷/4⌠/

Я довольно новичок в C ++ и пришел из Java, я просто не могу понять это. Спасибо.

Ответы [ 3 ]

2 голосов
/ 30 марта 2020

Привыкайте объявлять строковые параметры в качестве константной ссылки.

Вместо этого:

void addMessage(string s)
{
    ...
}

Это:

void addMessage(const string& s)
{
    ...
}

Мало того, что этого можно избежать делая копию строки, он также позволяет передавать string экземпляров, а также string literals и char* переменных, которые указывают на строки. Таким образом, вышеприведенное включает все следующее:

addMessage("Foobar");

const char* psz = <some other string>
addMessage(psz);

std::string s = "A string";
addMessage(s);

А затем для правильной печати строки с помощью printf, используйте функцию-член .c_str(), чтобы получить адрес указателя содержимого.

Вместо этого:

printf("%s\n", s);

Это:

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

И само собой разумеется, что cout предпочтительнее, чем printf:

cout << s << endl;

В целом:

static vector<string> added_messages;
static void addMessage(const string& message);
static void displayMessages();

int main()
{
    string message = "Testing 1 2 3";
    const char* psz = "Yet, another messsage);

    addMessage(message);
    addMessage("Another Message as a string literal);
    addMessage(psz);

    // sample printf statements
    printf("%s\n", message.c_str());
    printf("%s\n", psz);

    // sample cout statements - notice it can handle both pointers and string instances
    cout << message << endl;
    cout << psz << endl;
    cout << "Hello World" << endl;

    return 0;
}

void addMessage(const string& s)
{
    added_messages.push_back(s);
    printf("%s\n", s.c_str());
}

void displayMessages()
{
    for (const string& i : added_messages)
    {
        printf("%s\n", i.c_str());
    }

    added_messages.clear();
}
1 голос
/ 30 марта 2020

Вы не можете использовать printf ("% s") для объекта string () - это причина того, что у вас есть мусор в выводе. "% s" ожидает C string, ie указатель на символ, заканчивающийся нулевым байтом. Если вам нужно напечатать объект string (), используйте метод c_str (), чтобы получить C строковое представление, ie в вашем случае i.c_str (). C ++ смешивает понятия C с понятиями C ++, так что будьте внимательны. Используйте iostream header и std :: cout << i для вывода вашего объекта способом C ++. </p>

О передаче аргументов. В вашем примере вы делаете это хорошо, но имейте в виду, что в вашем случае вы делаете это по значению, ie создается копия объекта. Более эффективным является передача по ссылке.

0 голосов
/ 30 марта 2020

Это должно работать:

for(std::size_t i = 0; i < added_messages.size(); i++)
    printf("%s\n",added_messages[i].c_str());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...