我想解析用户输入的IP地址中的数字。我编写了以下代码来获取用户的输入IP地址并打印地址的每个字节。
代码:(现在我假设用户输入类似于“xx.xx.xx.xx”)
#include <stdio.h>
#include <string.h>
void main(){
char ip[16];
char buffer[6];
int i=0;
char temp;
int len;
char *ptr1;
char *ptr2;
char delim = '.';
while((temp = getchar()) != '\n')
{
ip[i++]=temp;
}
ip[i] = '\0';
ptr2 = ip;
for(i=0;i<4;i++){
ptr1 = strchr(ptr2,(int)delim);
strcpy(buffer,ptr2);
if(ptr1 != NULL){
buffer[ptr1-ptr2] = '\0';
ptr2=ptr1+1;
}
printf("\nString:%s",buffer);
}
getchar();
}
代码运行正常,但在运行或调试会话结束时,它会给出错误
Run-Time Check Failure #2 - Stack around the variable 'buffer' was corrupted.
我的代码有什么问题?
答案 0 :(得分:6)
strcpy(buffer,ptr2);
此行负责出错。您的buffer
大小为6,但ptr2
超过6个字符(例如xx.xx.xx.xx = 12),因此它会溢出。增加buffer
大小。它会解决你的问题。
按照@jonathon的建议添加数组绑定检查。此行ip[i++]=temp;
可能会为更大的输入带来问题。
答案 1 :(得分:2)
这么多问题:
#include <stdio.h>
#include <string.h>
void main(){
char ip[16];
char buffer[6];
int i=0;
char temp;
int len;
char *ptr1;
char *ptr2;
char delim = '.';
while((temp = getchar()) != '\n')
{
ip[i++]=temp; // What is preventing you from writing to ip[16+] ?
}
ip[i] = NULL; // '\0' is the NUL terminator. NULL is a pointer.
ptr2 = ip;
for(i=0;i<4;i++){
ptr1 = strchr(ptr2,(int)delim);
strcpy(buffer,ptr2); // Again, you can easily overrun buffer here
if(ptr1 != NULL){
buffer[ptr1-ptr2] = '\0';
ptr2=ptr1+1;
}
printf("\nString:%s",buffer);
}
getchar();
}