2016-11-17 5 views
0

文字列の長さを表示するためにstrlenを使用しようとしています。私はその2バイトの長さを知っています。しかし、strlenはゼロを返します。誰かがなぜ私を説明してくれますか?私を助けてください。2バイト文字列に対して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の文字列を理解できません。charの配列は '\ 0'です。 int16_tのバイト順を逆にして文字列に格納しようとしますか?いいえ。あなたの目的はなんですか ?私たちはもっとあなたを助けることができました。 – Stargateur

答えて

0

それが結果として、配列の最初のバイトは0に等しくなり、STRLENも0が返されるように起こり得る配列

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

に番号の一部をコピーし

機能strlenは、ゼロバイトが検出されるまでバイト数をカウントします。

1

あなたはファイルディスクリプタ

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

文字列またはここにバッファを使用する必要はありませんにuint16_tを書きたい場合。

複数の値を書き込む必要がある場合は、バッファを使用できます。少しの例。

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

1つのパケットにさらに値を追加する必要があります。 100以上の16ビット値。それで私は文字列を使っていたのです。 – Abu

+0

charバッファ[1024]のようにしたい場合はバッファを使い、文字列は忘れてしまいます。しかし、バッファリングが必要な場合は、行うのが非常に難しいです。あなたは特定のプロジェクトに必要ですか?あなたは何のプロトコルですか?私はあなたに少し例を挙げることができます、待ってください。 – Stargateur

+0

UDP、私はプロトコルについて私が[that](https://tools.ietf.org/html/rfc7049)のようなことを話すとき、その "const void * message" – Abu

関連する問題