У меня есть ошибка в этом месте:
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.
Поскольку 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),
за исключением того, что он может засорить остальную часть массива назначения неопределенными значениями и что следующие ошибки обнаруживаются во время выполнения и вызывают установленную в настоящее время функцию обработчика ограничения:
null
указательstrnlen_s(src, destsz);
другими словами, усечение произойдетперекрытие будет происходить между исходной и целевой строкой
Поведение не определено, если размер массива символов указывает на dest <знак равно strnlen_s(src, destsz) < destsz;
другими словами, ошибочное значение destsz не раскрывает предстоящее переполнение буфера.
Как и все проверенные функции, 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
вместо.)