0

バッファを印刷しようとすると、アプリケーションがクラッシュします。それ以外の場合は、正常に動作します。これはコードです:

irc.h

  class IRC
            {
              public:
                      void sockconnect(char * hName, int portNum);
                          void sockwrite(char* sendbuf);
                          char sockread(void);
                          bool connected;
                  private:
                          WSADATA wsaData;
                          SOCKET m_socket;
                          sockaddr_in clientService;
                          LPHOSTENT hostEntry;

};

irc.cc

char IRC::sockread(void)

  {
    int result;
    char buffer[DEFAULT_BUFLEN];
        result = recv(m_socket, buffer, DEFAULT_BUFLEN, 0);

        if (result > 0) {
             return *buffer;
              }
          else if (result == 0)
              {
             connected = false;
                 return *buffer;
              }
          else {
         printf("recv failed with error: %d\n", WSAGetLastError());
         return *buffer;
        }

   }

main.cc

 IRC client;

 while (client.connected == true) {
     char buffer = client.sockread();
         if (buffer == NULL)
           break;


        printf ("Buffer: %s\n",buffer);
       }
4

2 に答える 2

0

最初の文字を印刷したい場合

printf ("Buffer: %c\n",buffer);

全体を出力したい場合、 sockread は最初の文字ではなくバッファ全体を返す必要があります。そのためには、バッファの最初の要素のアドレスを返す必要があります。この場合、すでに動的に割り当てられているはずです。

printf ("Buffer: %s\n",buffer);

編集sockread()考えた後、次のように機能を変更するために後者が必要だと思います

  • 戻り値の型をcharからchar*またはそれ以上に変更しますconst char*
  • char buffer[DEFAULT_BUFLEN];char* buffer = new char[DEFAULT_BUFLEN];
  • return *bufferreturn buffer

また、この場合、バッファを削除することを忘れないでください

const char* buffer = client.sockread(); //not char buffer as in your code
printf ("Buffer: %s\n",buffer);
delete [] buffer;

h番目

于 2010-11-28T19:25:46.840 に答える
0

std::string を使用する必要があります。そのバッファを返すことはできません。ローカル スタック上にあります。単一の文字ではなく実際のポインターを返すことに成功したとしても、それはスコープ外であり、その中のデータは無効です。

std::string は、これらの問題をすべて処理します。使うだけで完了です。実際に失敗したときにバッファが無効に返されるなど、他の問題もあります。これが例外です。

std::string IRC::sockread()
{
    std::string s;
    s.resize(DEFAULT_BUFLEN);
    int result = recv(m_socket, &s[0], DEFAULT_BUFLEN, 0);

    if (result > 0) {
        return s;
    } else if (result == 0) {
        connected = false;
    } else {
        std::cout << "recv failed with error " << WSAGetLastError() << "\n";
    }
    throw std::runtime_error("Socket connection failed!");
}
于 2010-11-28T20:18:22.497 に答える