#c #arrays #string
#c #массивы #строка
Вопрос:
Я хочу проанализировать числа с 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] = '';
ptr2 = ip;
for(i=0;i<4;i ){
ptr1 = strchr(ptr2,(int)delim);
strcpy(buffer,ptr2);
if(ptr1 != NULL){
buffer[ptr1-ptr2] = '';
ptr2=ptr1 1;
}
printf("nString:%s",buffer);
}
getchar();
}
Код выполняется нормально, но в конце сеанса запуска или отладки он выдает ошибку
Run-Time Check Failure #2 - Stack around the variable 'buffer' was corrupted.
В чем проблема с моим кодом?
Комментарии:
1. Вы ничего не проверяете, чтобы убедиться, что вы остаетесь в пределах своих буферов стека!
2. @JonathonReinhart Прямо сейчас я предполагаю, что входными данными являются A.A.A.A, где A<=255.
3. Запустите свой код в отладчике и проверьте каждый доступ к вашим буферам. Опять же, вы не можете отправлять сообщения в SO с повреждением стека и не ожидать, что на отсутствие проверки границ будет указано, сложно .
4. Самая непосредственная причина вашего переполнения
strcpy(buffer, ptr2);
. Вы не можете поместитьсяA.A.A.A
в 6 байт.5. Я работаю над Visual Studio 2010. Я проверял переменные на каждом шаге и менял
ip[i] = 'NULL'
наip[i] = ''
(да, это была ошибка). Мой ввод был1.1.1.1
. Все та же ошибка.
Ответ №1:
strcpy(buffer,ptr2);
Эта строка отвечает за ошибку. Ваш buffer
размер равен 6, но ptr2
содержит более 6 символов (например, xx.xx.xx.xx = 12), поэтому он переполняет его. Увеличить buffer
размер. Это решит вашу проблему.
Также добавьте проверку привязки к массиву, как предложил @jonathon. Эта строка ip[i ]=temp;
может создать проблему для большего ввода.
Комментарии:
1. Также, ради любви
$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; // '' 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] = '';
ptr2=ptr1 1;
}
printf("nString:%s",buffer);
}
getchar();
}