2016-11-17 25 views
0

我想用strlen打印字符串的长度。我知道它的长度是2个字节。但是,strlen返回零。有人能解释我为什么吗?请帮帮我。strlen显示两个字节的字符串为0

#include <stdio.h> 
#include <stdint.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) { 
    int16_t f = -105; 
    unsigned char *s = malloc(2+1); 
    uint16_t m = htons((uint16_t)f); 
    memcpy(s,(unsigned char*)&m, 2); 
    int16_t v = s[0] << 8 | s[1]; 
    printf("%i \n",m); 
    printf("%i \n",v); 
    printf("%zu \n", strlen(s)); 
    return 0; 
} 
+0

打印字符串's'本身以查看会发生什么。 –

+0

'm'不是一个应对它的值的'char *'不会使它成为一个字符串... – LPs

+0

我不明白C中的一个字符串,它是一个由'\ 0'结尾的char数组。您尝试颠倒int16_t的字节顺序并将其存储在字符串中?没有意思。你的目的是什么?我们可以帮助你更多。 – Stargateur

回答

0

复制一个号码的一部分到阵列

memcpy(s,(unsigned char*)&m, 2); 

它可以发生这样的方式,由于产生的阵列的第一个字节将等于0和strlen的还将返回0 。

功能strlen计数字节,直到遇到零字节。

1

如果你想要一个uint16_t写入文件描述符

int socket; 
... 
uint16_t m = htons(-105); 
write(socket, &m, sizeof(m)); 

无需使用字符串或在这里的缓冲区。

如果您需要编写多个值,则可以使用缓冲区。一个小例子。

struct buffer { 
    uintmax_t size; 
    uint8_t buffer[1024]; 
} 

bool add_uint16_t(struct buffer *buffer, uint16_t value) 
{ 
    if (buffer->size + 2 >= 1024) 
     return true; 
    buffer->buffer[buffer->size++] = (value >> 0u) & 0xFFu; 
    buffer->buffer[buffer->size++] = (value >> 8u) & 0xFFu; 
    return false; 
} 

bool write_buffer(struct buffer *buffer, int socket) 
{ 
    return write(socket, buffer->buffer, buffer->size) != buffer->size; 
} 

void reset_buffer(struct buffer *buffer) 
{ 
    buffer->size = 0; 
} 
+0

我必须为一个数据包添加更多的值。超过100个16位值。这就是为什么我使用字符串。 – Abu

+0

如果你想像char buffer [1024]那样使用缓冲区,忘记字符串。但是如果你需要缓冲,这很难做到。你需要一个特定的项目吗?你的协议是什么?我可以让你成为一个小例子,等等。 – Stargateur

+0

UDP,我使用sendto中的“const void * message” – Abu

相关问题