正在从网络下载内容 URL

Downloading content from web URL

我正在尝试使用 WinInet.h 从 URL 地址获取数据。这是我的简化代码:

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但是缓冲区returns2.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ýýýý

任何人都可以向我解释为什么会这样吗?

您收到的数据是 C-style 字符串,即 null-character 终止字符数组。这里重要的部分是 5 个字符的字符串实际上需要一个大小为 6 的数组,例如:

"hello"

由6个字符组成的数组,'h''e''l''l''o''[=18=]' .

OutputDebugString 将遍历数组打印字符,直到到达 '[=18=]'.

在这种情况下,您不会为终止的 '[=18=]' 分配任何位置,因此 OutputDebugString 将继续运行,直到内存中恰好有一个 '[=18=]'(或直到它到达了不允许访问的内存。

更改此位:

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] = '[=12=]';