C++ strcpy_s 智能感知错误

C++ strcpy_s IntelliSense error

我这里有错误:

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。

最简单的解决方案是将 msgToGraphics 也设为 std::string,然后不使用 C 函数 strcpy_s,只需分配给它做同样的事情:

msgToGraphics = game.board_now();

如果你需要获取底层数组的非常量 char*,你可以这样做(有通常的注意事项):

p.sendMessageToGraphics(&msgToGraphics[0]);

但实际上您应该更改接口,使其不依赖于传入的字符数组。(提示:改用 std::string。)

因为 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. 作为所有边界检查函数,只有在 __STDC_LIB_EXT1__ 由实现定义并且用户将 __STDC_WANT_LIB_EXT1__ 定义为包括 string.h.

    3. 之前的整数常量 1

参考页面了解更多信息http://en.cppreference.com/w/c/string/byte/strcpy