2017-01-02 83 views
-3

嗨,大家好我在这个地方有错误:C++ strcpy_s智能感知错误

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 FUNC:

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。 感谢所有尝试帮助的人!

+3

为什么不'msgToGraphics'一个'的std :: string'呢?你可以避免很多麻烦,避免使用简单的'char'数组,在这种情况下,你可以通过operator =赋值给另一个字符串,如'msgToGraphics = game.board_now();'。 –

+0

,因为它必须是数组,因为这是接口接收的信息 – SimpleNigal

+1

这不是一个好的理由。您可以使用string :: c_str()将字符指针传递给您的API。 –

回答

1

由于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. 如果字符ar的大小未定义ray指向dest < = strnlen_s(src, destsz) < destsz;换句话说,destsz的错误值不会暴露即将发生的缓冲区溢出。

    2. 由于所有边界检查功能,strcpy_s仅保证可供如果__STDC_LIB_EXT1__由实现所定义,并且如果用户包括string.h之前定义__STDC_WANT_LIB_EXT1__为整数常数1。

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

1

最简单的解决办法是让msgToGraphics一个std::string过,然后而是采用了C函数strcpy_s的,只是分配给它做同样的事情:

msgToGraphics = game.board_now(); 

如果你需要得到一个非-const char*为基础数组,你可以做这样的(与通常的警告):

p.sendMessageToGraphics(&msgToGraphics[0]); 

不过说真的,你应该更改为不依赖于字符数组的接口在传递(提示:使用std::string代替。)