为什么此代码段会提供此输出?我需要递增数据包。
while(1) {
if(argv[3]) {
strcpy(buf, argv[3]);
} else {
msg = "This is a UDP test string! (packet %d)\n", ++pktcnt;
strcpy(buf, msg);
}
ret = sendto(udpSocket, buf, strlen(buf)+1, 0, (struct sockaddr*)&udpServer, sizeof(udpServer));
if(ret == -1) {
fprintf(stderr, "Could not send message!\n");
return -1;
} else {
printf("Message sent. (packet %d)\n", pktcnt);
}
sleep(1);
}
接收器输出:
This is a UDP test string! (packet %d)
This is a UDP test string! (packet %d)
This is a UDP test string! (packet %d)
显然格式字符串存在问题,但我无法弄明白:| 我确定这是一个简单的错误,但我还不太了解C,这可以在python中运行!
答案 0 :(得分:3)
msg = "This is a UDP test string! (packet %d)\n", ++pktcnt
这不是你如何将格式化的字符串放入C中的变量。
您需要使用sprintf
,并且需要确保在字符串中分配了足够的空间。例如
char msg[200];
sprintf(msg, "This is a UDP test string! (packet %d)\n", ++pktcnt);
或者您可以将其直接放入buf
:
sprintf(buf, "This is a UDP test string! (packet %d)\n", ++pktcnt);
假设你有足够的空间。记住在C中你必须自己分配空间 - 函数不会为你做这些事情,你会得到很多分段错误,直到你得到消息......。
答案 1 :(得分:2)
msg = "This is a UDP test string! (packet %d)\n", ++pktcnt;
在上面的语句中,lhs上的逗号是逗号运算符。它在所有运营商中的优先级最低。它计算其第一个操作数,然后计算其第二个操作数,然后返回第二个操作数的计算结果。在第一和第二操作数的评估之间存在序列点。因此,该陈述实际上等同于
(msg = "This is a UDP test string! (packet %d)\n"), ++pktcnt;
| | | |
|________________________________________________| |_______|
| |
| |
assignment expression prefix increment
语句计算前缀增量运算符的值。因此,msg
始终指向字符串文字
"This is a UDP test string! (packet %d)\n"
要格式化字符串,您应该使用snprintf
函数。
char buff[100+1]; // +1 for the terminating null byte
msg = "This is a UDP test string! (packet %d)\n"
// write at most sizeof(buff) = 101 bytes into the
// buffer buff including the terminating null byte
snprintf(buff, sizeof buff, msg, ++pkcnt);
答案 2 :(得分:1)
在将msg
复制到buf
msg = "This is a UDP test string! (packet %d)\n", ++pktcnt;
strcpy(buf, msg)
sprintf(msg, "This is a UDP test string! (packet %d)\n", ++pktcnt);
看起来你正在使用像sprintf这样的东西,但后来删除了它?
尝试类似
的内容{{1}}