#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
为什么第一个值重复。代码中出了什么问题
答案 0 :(得分:6)
因为你在字符串中写了太多数据。
char src_address[15];
是15个字符长,包括终止0字符,因此您不能将超过14个字符放入其中。但是,123.123.123.123
是15个字符。
由于两个字段src_address
和dst_address
恰好存储在连续的内存块中,因此写入后者的值立即跟随 - 没有分隔0字节 - 前者。因此,当您打算打印前者时,printf
不得不打印。
您应该在char数组中保留足够的空间以包含终止0值(并明确确保它确实放在那里!)。通常,在现实生活中的应用中,您应该defend yourself against buffer overruns caused by too long input。