C 将此IP解析为正确的长度?

C 将此IP解析为正确的长度?,c,winapi,ip,C,Winapi,Ip,对于我正在做的事情,我希望获得运行C语言编写的程序的PC的外部IP。到目前为止,我发现最好的方法是连接到一个只显示访问者IP的站点,然后解析该IP的网页。第一部分很简单,但当我显示缓冲区时,我读取的页面只明显由我的IP组成,我在IP之后得到一些随机的额外符号/字符。下面是我用来排除其他东西的代码: HINTERNET OpenInternet = NULL; HINTERNET GetIP = NULL; DWORD BytesRead = 0; char IPGrabbed[30]; Ope

对于我正在做的事情,我希望获得运行C语言编写的程序的PC的外部IP。到目前为止,我发现最好的方法是连接到一个只显示访问者IP的站点,然后解析该IP的网页。第一部分很简单,但当我显示缓冲区时,我读取的页面只明显由我的IP组成,我在IP之后得到一些随机的额外符号/字符。下面是我用来排除其他东西的代码:

HINTERNET OpenInternet = NULL;
HINTERNET GetIP = NULL;
DWORD BytesRead = 0;
char IPGrabbed[30];

OpenInternet = InternetOpen("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (OpenInternet == NULL) {
    return 1;
}

GetIP = InternetOpenUrl(OpenInternet, "http://api.externalip.net/ip/", NULL, 0, INTERNET_FLAG_RELOAD, 0);
if (GetIP == NULL) 
    return 1;

if (!InternetReadFile(GetIP, &IPGrabbed, sizeof(IPGrabbed), &BytesRead)) 
    return 1;

printf("IP: %s", IPGrabbed);
getchar();
我还尝试通过IPF解析,在任何“\n”或“\r”处停止,因为当我打印它时,它会在IP下方的行上显示奇怪的字符,然后将所有内容复制到另一个字符数组,但得到了相同的结果。有人能帮我弄清楚这是怎么回事吗?谢谢。

InternetReadFile的结果不是以null结尾的,您需要在读取成功后通过代码在字符串末尾添加一个null字符:

IPGrabbed[BytesRead] = 0;
编辑1 正如Jonathan Potter在评论中所建议的,如果访问的站点返回的IP字符串长度超过最大16个字符,则上述代码可能会出现缓冲区溢出错误。 建议将InternetReadFile更改为读取的缓冲区长度减少1,而不是整个缓冲区长度,以消除上述问题

InternetReadFile(GetIP, &IPGrabbed, sizeof(IPGrabbed)-1, &BytesRead) 

将缓冲区初始化为所有0,然后读取比要读取的缓冲区少一个字符

通过这种方式隐式提供C字符串所依赖的0终止符

char IPGrabbed[30] = ""; /* Initialise the buffer to all `0`s ... */

[...]

/* ... and then read one character less then the buffer to read into provides. */
if (!InternetReadFile(GetIP, &IPGrabbed, sizeof(IPGrabbed) - 1, &BytesRead)) 
  return 1;

fprintf(stderr, "IP: %s", IPGrabbed); /* Print to stderr, as it's not buffered so 
                                  everything appear immediately to the console. */

请输入和输出示例。如果BytesRead==sizeofIPGrabbed,则缓冲区溢出。@JonathanPotter,谢谢你的提示,你的建议正在被纳入答案中。谢谢,这在很大程度上解决了问题,但现在IP后面只显示了大量空白字符。当我读取char数组的strlen时,我得到了14,尽管它不是那么多。有没有办法找出IP后面的这些空白字符是什么?谢谢你的回答,现在看起来很明显了。@RobLennon:你希望它们是什么,然后是空白?我真的想知道如何才能知道这些字符是什么,这样我就可以截断那里的字符串,但我知道了我们的方法。我只是设置了一个for循环,它遍历IP的每个字符,如果既不是数字也不是句点,它就知道IP真正结束的位置。谢谢。@RobLennon:不客气,我很高兴看到我已经回答了你的问题。如果你甚至喜欢我的答案,你也可以随意投票-