Загрузка контента с веб-адреса - PullRequest
2 голосов
/ 22 мая 2019

Я пытаюсь получить данные с URL-адреса, используя WinInet.h. Вот мой упрощенный код:

LPCTSTR url = (LPCTSTR) "https://example.com"; // 2.9.1
HINTERNET connection = InternetOpenA(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET request = InternetOpenUrlA(connection, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);

char status_code[10];
DWORD info_size = 10000;
HttpQueryInfoA(request, HTTP_QUERY_STATUS_CODE, status_code, &info_size, NULL);

DWORD size;
DWORD dwRead = 0;
InternetQueryDataAvailable(request, &size, 0, 0); // size = 5

char * buffer = new char[size]; // size = 5
InternetReadFile(request, buffer, size, &dwRead);
OutputDebugString(buffer); // 1.2.3ýýýý

InternetCloseHandle(connection);
InternetCloseHandle(request);

Работает хорошо, но данные на URL-адресе 2.9.1, но буфер возвращает 2.9.1ýýýý.

Если я пытаюсь напечатать char после char, это результат:

for (int i = 0; i < size; i++)
    OutputDebugString(&buffer[i]);

char[0] = 2.9.1ýýýý
char[1] = .9.1ýýýý
char[2] = 9.1ýýýý
char[3] = .1ýýýý
char[4] = 1ýýýý

Может кто-нибудь объяснить мне, почему это происходит?

1 Ответ

2 голосов
/ 22 мая 2019

Данные, которые вы получаете, являются строкой в ​​стиле C, то есть массивом символов с нулевым символом в конце. Важной частью здесь является то, что строка из 5 символов на самом деле требует массив размером 6, например:

"hello"

состоит из массива из 6 символов, 'h', 'e', 'l', 'l', 'o', '\0'.

OutputDebugString будет проходить через массив, печатающий символы, пока не достигнет '\0'.

В этом случае вы нигде не выделяете место для завершения '\0', поэтому OutputDebugString будет продолжать работать до тех пор, пока в памяти не окажется '\0' (или пока он не достигнет памяти, к которой не разрешен доступ ).

Изменить этот бит:

char * buffer = new char[size]; // size = 5
InternetReadFile(request, buffer, size, &dwRead);

будет

char * buffer = new char[size + 1]; // size = 5, allocate 6 chars
InternetReadFile(request, buffer, size, &dwRead);
buffer [size] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...