我正在尝试使用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
,但是缓冲区返回了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ýýýý
有人可以向我解释为什么会这样吗?
答案 0 :(得分:2)
您接收到的数据是C样式的字符串,即以空字符结尾的字符数组。这里的重要部分是一个5个字符的字符串实际上需要一个大小为6的数组,例如:
*=
由6个字符组成的数组,分别为"hello"
,'h'
,'e'
,'l'
,'l'
,'o'
。 / p>
'\0'
将遍历数组打印字符,直到到达OutputDebugString
。
在这种情况下,您不会为终止的'\0'
分配任何空间,因此'\0'
会一直继续下去,直到在内存中碰巧有OutputDebugString
为止(或直到它到达内存)。
更改此位:
'\0'
成为
char * buffer = new char[size]; // size = 5
InternetReadFile(request, buffer, size, &dwRead);