"堆叠变量'缓冲区'被腐蚀了#34; - 这里有什么问题

时间:2014-06-24 05:35:16

标签: c arrays string

我想解析用户输入的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.

我的代码有什么问题?

2 个答案:

答案 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();

}