Как передать строку в gets_s () в C ++? - PullRequest
0 голосов
/ 11 июля 2020
#include<iostream>

using namespace std;

int main() {
    string str;
    gets_s(str);
    cout << str << endl;
    return 0;
}

Когда я попытался запустить приведенный выше код, он выдал ошибку, что ни один экземпляр gets_s() не соответствовал списку аргументов. Как я могу передать std::string вместо char[] в gets_s() функцию, если это возможно?

Ответы [ 5 ]

3 голосов
/ 11 июля 2020

Функция C get_s принимает char* и аргумент длины, а не std::string.

Лучшие варианты:

  • Форматированный ввод:

    std::cin >> str;
    
  • Прочитать строку:

    std::getline(std::cin, str);
    
0 голосов
/ 11 июля 2020

Ну, по поводу std::getline ответов много, но если вам действительно нужно использовать get_s, вы можете написать такой код:

size_t length = 10; // Just for example
std::string my_string(length, 0);
get_s(&my_string[0], length); // C++14 and older
get_s(my_string.data(), length); // C++17 and newer
0 голосов
/ 11 июля 2020

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

Поскольку вы используете string, лучшей альтернативой является использование getline

#include <iostream>
#include <string>
using namespace std;

string str;
getline(cin, str);

Это расширит строку, чтобы она содержала столько символов, сколько вводит пользователь.

0 голосов
/ 11 июля 2020

gets_s() принимает два аргумента: указатель на массив char и максимальный размер (в вашем вызове он отсутствует). Вы не можете передать std::string - только строки стиля C.

Вместо C функций, почему бы не использовать способ C ++ std::cin >> str или getline(std::cin, str)?

В C также не используйте gets_s() (это необязательно в C11) или gets() - используйте вместо него fgets().

0 голосов
/ 11 июля 2020

Не делай этого. Используйте поток как обычно:

#include<iostream>
using namespace std;
int main()
{
    string str;
    cin >> str;
    cout << str << endl;
    return 0;
}
...