正在从网络下载内容 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=]';
我正在尝试使用 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=]';