c++取 ip 源代码 的错误 高手帮我纠正一下

c++取 ip 源代码 的错误 高手帮我纠正一下,第1张

需要winsock2h而不是winsockh。

winsockh应该在一个很早的Windows版本里面就不支持了。

你的程序正常工作,不过需要注意的是,wwwip138com的ip地址已经变成221547136而不是你原来的221547132了,我帮你改过来了,否则服务器会连接超时。

#include <winsock2h>

#include <stdioh>

#pragma comment(lib,"wsock32lib")

void start(){

WSAData wsaDat;

short Port = 80;

WSAStartup(MAKEWORD(1,1),&wsaDat);

SOCKET sd = socket(AF_INET, SOCK_STREAM, 0);

SOCKADDR_IN sockAddr;

memset((void)&sockAddr,0,sizeof(sockAddr));

sockAddrsin_family=AF_INET;

sockAddrsin_port=htons(Port);

sockAddrsin_addrs_addr=inet_addr("221547136");

connect(sd,

(LPSOCKADDR)&sockAddr,

sizeof(sockAddr));

char sendstr[]="GET /ip2cityasp HTTP/11\r\nAccept: /\r\nReferer: \r\nUser-Agent: Mozilla/40\r\nHost: wwwip138com\r\nConnection: close\r\n\r\n\0";

char p;

int iLen = strlen(sendstr);

p = sendstr;

while (iLen){

int iRet = send(sd,p,iLen,0);

if (iRet > 0) {

p += iRet;

iLen -= iRet;

continue;

}

return;

}

char recvstr[1024];

memset(recvstr,0,1024);

p = recvstr;

char iIndex_Head ;

iLen = 1024;

int need_len = -1;

while (iLen){

int iRet = recv(sd,p,iLen,0);

if (iRet <= 0) {

return;

}

p += iRet;

iLen -= iRet;

if ((iIndex_Head = strstr(recvstr,"\r\n\r\n"))&&(need_len==-1)) {

char iIndex = strstr(recvstr,"Content-Length:");

if (!iIndex) {

continue;

}

char p1 = iIndex + strlen("Content-Length:");

need_len = iIndex_Head - recvstr + 2 + atol(p1);

}

if (1024 - iLen >=need_len) { break;

}

}

char p1 = strstr(iIndex_Head,"[");

char p0 = strstr(p1,"]");

p0 = '\0';

printf("IP=%s",p1+1);

closesocket(sd);

WSACleanup();

}

int main(){

start();

}

debug 模式下看到字符串输出 “烫”,说明读取到了不应该读取的内存。。。

当 readfile 函数返回的时候,caption 这个数组已经被释放掉了。。。

你可以改用 malloc 在堆里分配内存,但这样的话就要求调用者要手动把它 free 掉;这也是为什么 C 语言的很多函数如果要输出字符串,一般都是弄一个指针参数,由调用者提供内存

multiplication()函数的最后一句last = i - 1;应改为arr[0] = i - 1;

因为last是临时变量,改动它没有意义,赋值到arr[0]上才能真正保存结果

不过虽然你的程序实现了一个大数与一个整数n相乘

但是最后两个大数a[]和b[]相乘的实现逻辑是有问题的

根据竖式乘法的过程,a[]和b[]相乘的流程应为:

a[]b[1]+a[]b[2]10+a[]b[3]100+

而你的实现是:a[]b[1]b[2]b[3],显然是不对的

因此改动如下:新定义shiftBits()函数实现a[]10^k,即将数组[]右移k位

新定义add()函数实现a[]和b[]相加~最终的代码为:

运行结果为:

可见成功输出了两个大数相乘的结果~

附修改后的源码:

#include <stdioh>

#include <stringh>

#define MAXSIZE 100

void preserve(int arr[], long long num) { // 大数转为数组

    int i = 1;

    do {

        arr[i++] = num % 10;

        num /= 10;

    } while (num > 0);

    arr[0] = i - 1;

}

void processCarry(int arr[]) { // 进位处理

    int i;

    for (i = 1; i <= arr[0] || arr[i] != 0; i++) {

        arr[i + 1] += arr[i] / 10;

        arr[i] %= 10;

    }

    arr[0] = i - 1; // 可能进位,更新位数

}

void shiftBits(int arr[], int res[], int k) { // arr[]依次右移k位

    int i;    

    for (i = 1; i <= arr[0]; i++)

        res[i + k] = arr[i];

    res[0] = arr[0] + k;

}

void add(int a[], int b[]) { // 两个大数相加,结果保存在a[]中

    int i;

    a[0] = a[0] > b[0] a[0] : b[0];

    for (i = 1; i <= a[0]; i++)

        a[i] += b[i];

    processCarry(a);

}

void multiplication(int a[], int b[]) { // 两个大数相乘,结果保存在a[]中

    int i, j;

    int tmp[MAXSIZE] = {0}, res[MAXSIZE] = {0}; // tmp为每位乘积结果,res为加和结果

    for (i = 1; i <= b[0]; i++) { // b[i]逐位与a[]相乘

        memset(tmp, 0, MAXSIZE);

        shiftBits(a, tmp, i - 1); // 先将a[]右移i-1位到tmp[]

        for (j = 1; j <= tmp[0]; j++) // 再逐位乘以b[i]

            tmp[j] = b[i];

        add(res, tmp);

    }

    for (i = 0; i <= res[0]; i++) // 最后将res[]复制到a[]

        a[i] = res[i];

}

int main() {

    long long i, a, b;

    int m[MAXSIZE] = {0}, n[MAXSIZE] = {0};

    printf("请输入两个大数: ");

    scanf("%lld %lld", &a, &b);

    preserve(m, a);

    preserve(n, b);

    multiplication(m, n);

    for (i = m[0]; i >= 1; i--)

        printf("%d", m[i]);

    return 0;

}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12457180.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存