snprintf()只读取直到新行字符?

时间:2018-05-19 11:44:47

标签: c newline

我想通过看起来像这样的套接字发送消息:“USER anonymous \ r \ n”。 为了创建格式化的字符串而不是常量字符串,我使用了snprintf()。不幸的是,它似乎没有复制换行符\n,只是复制回车\r

#define USERNAME_ANONYMOUS "anonymous"
[...]


// Inside a function.
int sz = snprintf(NULL, 0, "USER %s\r\n", USERNAME_ANONYMOUS);
char* username = NULL;
if ((username = calloc(sz + 1, sizeof(char))) == NULL) {
    perror("Could not allocate memory");
    return;
}
snprintf(username, sz, "USER %s\r\n", USERNAME_ANONYMOUS);
for (int i = 0; i <= sz; i++) {
    printf("%c  %d\n", username[i], username[i]);
}

输出:

U  85
S  83
E  69
R  82
   32
a  97
n  110
o  111
n  110
y  121
m  109
o  111
u  117
s  115
  13
  0
  0

2 个答案:

答案 0 :(得分:3)

来自this snprintf (and family) reference

  

最多bufsz - 写入1个字符。

您提供的尺寸必须包括终结符。您需要使用sz + 1来打印完整的字符串。

答案 1 :(得分:0)

好吧,如果您分配一个大小为sz + 1的缓冲区,那么将缓冲区大小传递给第二个snprintf调用,即sz + 1而不是{{ 1}},这是你传递的数字。

sz的第二次调用应为:

snprintf

或者它会用null终结符覆盖最后一个snprintf(username, sz + 1, "USER %s\r\n", USERNAME_ANONYMOUS); ,因为它没有足够的空间容纳你想要打印的整个字符串。

相关问题