2014-11-21 23 views
0

我已经使用了C并且在代码中发现了一些问题,这已经有一段时间了。我有一个结构作为这样的:C - strcpy似乎连接了存储在结构中的连续值

struct packet 
{ 
char seq[4]; 
char type[4]; 
char src[10]; 
char dst[10]; 
char payload[MAX_BUF_LEN]; //predefined buffer length constant 
} 

然后接收由空格隔开的字符串时,我想这些“场”的复制到相应struct packet变量之一。以下是我有:

strcpy(temp_buf, buf); 
field=strtok(temp_buf, " "); 

例字符串中temp_buf: “1发送8273940124 9472849351你好”

strcpy(inet_packet.seq, field); 
field=strtok(NULL, " "); 
strcpy(inet_packet.type, field); 
field=strtok(NULL, " "); 
strcpy(inet_packet.src, field); 
field=strtok(NULL, " "); 
strcpy(inet_packet.dst, field); 
field=strtok(NULL, "\n"); 
printf("field: %s\n", field); //Shows field="hello" 
strcpy(inet_packet.payload, field); 

然而,在上面的例子中输入,inet_packet.type = send82739501249472849351hello 所以;它似乎将每个连续的副本连接成类型?已经尝试了几种不同的东西,但仍然没有得到预期的结果。

+0

为了方便他人帮助你,请撰写并发布http://www.sscce.org/ – pts 2014-11-21 00:14:15

+0

你写道,你已经尝试了几个不同的东西。请发布您尝试过的所有内容(包括完整的源代码),收到的输出以及为什么它对您不利。 – pts 2014-11-21 00:14:56

+1

我不确定这是否与您遇到的问题有关,但我注意到,您的三个结构成员(type,src和dest)不够大,无法包含您提供的字符串和null终止。 – doppelheathen 2014-11-21 00:19:26

回答

1

C字符串必须是NUL终止的。因此,您的声明char type[4]不足以容纳字符串send而没有溢出。

将此声明更改为char type[5]并确保您的确如此做而不是在此处放置一个长度超过4个字符的字符串。

+0

这样做。对于根本问题是什么意想不到的行为,我认为如果这是问题,那么字符串最终会被切断,尽管如此。谢谢。 – user2950936 2014-11-21 00:39:16

+0

@ user2950936:是的。 'strcpy()'不是很聪明,并且会愉快地覆盖超过目标缓冲区的末尾。 – 2014-11-21 00:53:11