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);
换句话说,会发生截断
重叠 将出现在源和目标字符串之间
如果 dest <= strnlen_s(src, destsz) < destsz;
指向的字符数组的大小,则行为未定义,换句话说,destsz 的错误值不会暴露即将发生的缓冲区溢出。
作为所有边界检查函数,只有在 __STDC_LIB_EXT1__
由实现定义并且用户将 __STDC_WANT_LIB_EXT1__
定义为包括 string.h
.
之前的整数常量 1
我这里有错误:
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);
换句话说,会发生截断 重叠 将出现在源和目标字符串之间
如果 dest <=
strnlen_s(src, destsz) < destsz;
指向的字符数组的大小,则行为未定义,换句话说,destsz 的错误值不会暴露即将发生的缓冲区溢出。作为所有边界检查函数,只有在
__STDC_LIB_EXT1__
由实现定义并且用户将__STDC_WANT_LIB_EXT1__
定义为包括string.h
. 之前的整数常量 1