вывести значение из структуры - PullRequest
0 голосов
/ 17 января 2011
#include<stdio.h>

struct classifier
{
    char src_address[15];
    char dst_address[15];
    int src_port;
    int  dst_port;
};

main()
{
    int i;
    struct classifier clsf[4];
    struct classifier *ptr;

    for(i = 0; i < 2; i++)
    {
        ptr = & clsf[i];
        scanf("%s",ptr[i].src_address);
        scanf("%s",ptr[i].dst_address);
        scanf("%d",&ptr[i].src_port);
        scanf("%d",&ptr[i].dst_port);
        display(ptr[i]);
    }
}

void display(struct classifier ptr)
{
    printf("\n%s", ptr.src_address );
    printf("\n%s", ptr.dst_address );
    printf("\n%d", ptr.src_port);
    printf("\n%d", ptr.dst_port );
}

o / p, который я получаю, похож на это

this is i/p

123.123.123.123 
213.234.234.124
3244
1342

o/p
123.123.123.123213.234.234.124
213.234.234.124
3244
1342 

почему это первое значение повторяется. что не так в коде

1 Ответ

6 голосов
/ 17 января 2011

Поскольку вы записываете слишком много данных в свои строки.

char src_address[15];

имеет длину 15 символов, включая завершающий символ 0, поэтому вы не должны помещать в него более 14 символов.Тем не менее, 123.123.123.123 равно 15 символам.

Поскольку два поля src_address и dst_address хранятся в последовательных блоках памяти, значение, записанное в последний, следует сразу - без разделительного байта 0 -бывший.Таким образом, printf не может не печатать оба, когда вы собираетесь печатать первое.

Вы должны зарезервировать достаточно места в ваших массивах символов, чтобы включить конечное значение 0 (и явно убедиться, что оно действительно помещено туда!).В общем, в реальных приложениях вы должны защитить себя от переполнения буфера , вызванного слишком длинным вводом .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...