2014-06-24 102 views
1

我想解析用戶輸入的IP地址中的數字。我寫了下面的代碼,從用戶處獲取輸入IP地址並打印地址的每個字節。」圍繞變量「緩衝區」的堆棧已損壞「 - 這裏有什麼問題

CODE:(現在我假設用戶輸入是像「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. 

我的代碼有什麼問題?

+1

您不檢查*任何內容*以確保您處於堆棧緩衝區的範圍內! –

+0

@JonathonReinhart現在我假設輸入是A.A.A.A,其中A <= 255。 – Bishal

+0

在調試器下運行您的代碼,並驗證對緩衝區的每次訪問。再說一遍,你不能在堆棧損壞的情況下發布到SO,也不會指望你缺少邊界檢查,* hard *。 –

回答

5
strcpy(buffer,ptr2); 

這條線負責錯誤。您的buffer大小爲6,但ptr2超過6個字符(例如xx.xx.xx.xx = 12),因此會溢出。增加buffer大小。它會解決你的問題。

另外加按@jonathon建議的數組綁定檢查。這條線ip[i++]=temp;可能會造成更大的輸入問題。

+3

另外,爲了'$ DEITY'的愛,**添加邊界檢查**。 –

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

} 
相關問題