C++ strcpy_s ошибка IntelliSense

У меня есть ошибка в этом месте:

strcpy_s(msgToGraphics, game.board_now());

ошибка:

IntelliSense: no instance of overloaded function "strcpy_s" matches the argument list argument types are: (char [1024], std::string)    

и вот функция game.board_now:

string Board::board_now()
{
return _board;
}

и вот остальная часть кода, где я пытаюсь использовать strncpy_s():

#include "Pipe.h"
#include "Board.h"
#include <iostream>
#include <thread>

using namespace std;
void main()
{
    srand(time_t(NULL));

    Pipe p;
    bool isConnect = p.connect();

    string ans;
    while (!isConnect) {
        cout << "cant connect to graphics" << endl;
        cout << "Do you try to connect again or exit? (0-try again, 1-exit)" << endl;
        cin >> ans;

        if (ans == "0") {
            cout << "trying connect again.." << endl;
            Sleep(5000);
            isConnect = p.connect();
        }
        else {
            p.close();
            return;
        }
    }

    char msgToGraphics[1024];
    // msgToGraphics should contain the board string accord the protocol
    // YOUR CODE
    Board game;
    //strcpy_s(msgToGraphics, game.board_now()); // just example...

    p.sendMessageToGraphics("rnbkqbnrpppppppp################################PPPPPPPPRBNKQNBR0"); // send the board string

    // get message from graphics
    string msgFromGraphics = p.getMessageFromGraphics();

    while (msgFromGraphics != "quit") {
        game.change_board(msgFromGraphics);
        game.change_board_sq(msgFromGraphics);
        strcpy_s(msgToGraphics, game.board_now()); // msgToGraphics should contain the result of the operation

        // return result to graphics
        p.sendMessageToGraphics(msgToGraphics);

        // get message from graphics
        msgFromGraphics = p.getMessageFromGraphics();
    }

    p.close();
}

Код в основном для шахматной программы, и я пытаюсь получить шахматную доску после внесенных мной изменений, и я не знаю, как отформатировать его в strcpy_s() для того, чтобы поместить его в массив и отправить его обратно в данный exe.

2 ответа

Решение

Поскольку C11 strcpy_s

1) `char *strcpy( char *dest, const char *src );`  
2) errno_t strcpy_s(char *restrict dest, rsize_t destsz, const char *restrict src);

Параметр strcpy_s такой же, как (1), за исключением того, что он может засорить остальную часть массива назначения неопределенными значениями и что во время выполнения обнаруживаются следующие ошибки и вызывается установленная в настоящее время функция обработчика ограничения:

  • SRC или Dest является null указатель
  • destsz равен нулю или больше, чем RSIZE_MAX
  • Destsz меньше или равно strnlen_s(src, destsz); другими словами, усечение произойдет
  • перекрытие будет происходить между исходной и целевой строками

    1. Поведение не определено, если размер массива символов указывает на dest <= strnlen_s(src, destsz) < destsz; другими словами, ошибочное значение destsz не раскрывает предстоящее переполнение буфера.

    2. Как и все проверенные функции, strcpy_s гарантированно будет доступен, только если __STDC_LIB_EXT1__ определяется реализацией, и если пользователь определяет __STDC_WANT_LIB_EXT1__ до целой константы 1, прежде чем включать string.h,

Обратитесь к странице для получения дополнительной информации http://en.cppreference.com/w/c/string/byte/strcpy

Самое простое решение было бы сделать msgToGraphics std::string тоже, а потом вместо использования функции C strcpy_s, просто назначьте ему сделать то же самое:

msgToGraphics = game.board_now();

Если вам нужно получить неконстантный char* к базовому массиву вы можете сделать это следующим образом (с обычными оговорками):

p.sendMessageToGraphics(&msgToGraphics[0]);

Но на самом деле вы должны изменить интерфейс, чтобы не полагаться на передаваемый массив char. (Подсказка: используйте std::string вместо.)

Другие вопросы по тегам