从结构中提取价值

pra*_*eep 0 c

#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 );
}
Run Code Online (Sandbox Code Playgroud)

我得到的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 
Run Code Online (Sandbox Code Playgroud)

为什么第一个值重复.代码有什么问题

Pét*_*rök 6

因为您在字符串中写入了太多数据.

char src_address[15];
Run Code Online (Sandbox Code Playgroud)

是15个字符长,包括终止0字符,因此你不能超过14个字符.但是,123.123.123.123是15个字符.

由于两个场src_addressdst_address碰巧被存储在连续的存储块,写入到后者的值紧跟-无分离0字节-前者.因此printf,当您打算打印前者时,不能打印两者.

您应该在char数组中保留足够的空间以包含终止0值(并明确确保它确实放在那里!).一般来说,在现实生活中的应用程序中,您应该防止 由于输入过长导致的缓冲区溢出.