2017-01-02 2 views
-3

Привет ребята У меня есть ошибка в этом месте: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 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' в зЬй :: string' а? Вы можете избежать множества головных болей, избегая простых массивов 'char', и в этом случае вы можете просто назначить одну строку другому через оператор =, как в' 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__ определяется реализацией, и если пользователь определяет __STDC_WANT_LIB_EXT1__ к целой константы 1 перед включением string.h.

См страницу для получения дополнительной информации 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 вместо этого.)

Смежные вопросы