1

クライアントで sprintf を使用してバッファを保持する char[] を出力しようとしています。最後の文字は「\0」です。これは私のサーバーコードです:

char buffer[MAXDATASIZE];
char res[MAXDATASIZE];

memset(buffer, '\0', MAXDATASIZE);
memset(res, '\0', sizeof(res));

if ((numbytes=recv(new_fd, buffer, sizeof(buffer), 0)) == -1) {
        perror("recv");
        exit(true);
}
buffer[numbytes] = '\0'; // add null terminator

sprintf(res, "test \"%s\" not found amongst the batting figures.\n Please check your spelling and try again.", buffer);

if (send(new_fd, res, sizeof(res), 0) == -1){
        perror("send");
}

これは次のように表示されます: test "term" が出力され、残りの res[] は表示されません (つまり、"not found within...")。これを修正するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

0

実行すると、未定義の動作が発生する可能性があります

buffer[numbytes] = '\0'

のようnumbytes=recv(new_fd, buffer, sizeof(buffer), 0)sizeof(buffer)buffer[numbytes] = '\0'書き込みますbuffer[sizeof(buffer)]。使用する

recv(new_fd, buffer, sizeof(buffer) - 1, 0)

さらに、の値にsprintf(res, ...書き込みます。フォーマットに余分なテキストがあると、オーバーランが発生する可能性があります。提案resbuffer

const char format[] = "test \"%s\" not found amongst the batting figures.\n Please check your spelling and try again.";
char res[MAXDATASIZE+sizeof(format)];
sprintf(res, format, buffer);

最後に、あなたが望むかもしれません

send(new_fd, res, strlen(res) /* maybe +1 */), 0)
于 2013-10-17T03:20:16.823 に答える