2016-11-17 26 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

相關問題