通过网络在C中格式化字符串错误

时间:2014-04-21 18:12:12

标签: c udp c-strings

为什么此代码段会提供此输出?我需要递增数据包。

    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中运行!

3 个答案:

答案 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}}