
需要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;
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)