0

null ターミネータで区切られた 2 つの変数で構成される文字列を作成しようとしています。使用しているカスタム プロトコルでは、このようにする必要があります。

const char* vendorChar = "3333-3333-4444-aaa3-3333";
const char* userChar = "someUsername";

char usernameString[strlen(vendorChar) + strlen(userChar) + 1];
char* uPtr = usernameString;

strcpy(uPtr, vendorChar);
strcpy(uPtr+strlen(vendorChar)+1, userChar);

上記のコードを実行すると、vendorChar の値のみが送信され、userChar は無視されます。動作しているときは、次のようになります

4444-2222-3333-1111\0someUsername

これまでのところ、str関数は文字列の末尾にある null を削除することを学びました。私はmemcpyそれを保存するために使用する必要があると思いますが、方法がわかりません。

4

3 に答える 3

1

あなたの仮定は正しいです。 strcpy は、thisによると、中間のヌル文字までコピーする可能性があり、これをstrcpy(char *str1, const char *str2)行います:

str2 が指す文字列を str1 にコピーします。str2 のヌル文字までコピーします。str1 と str2 がオーバーラップする場合、動作は未定義です。

memcpy は、メモリを文字列ではなくバイトのチャンクとして扱うだけなので、問題を解決するはずです。

strcpy 署名:

char *strcpy(char *dest, const char *src);

memcpy 署名:

void *memcpy(void *dest, const void *src, size_t n);

したがって、名前を置き換えて累積の長さを追加するだけです(もちろん両方のヌル文字を使用)。

編集

ここで提起された疑問を解消するために、次のコードを検討してください。

#include "string.h"
#include "stdio.h"
int main() {

    char x[10] = {0};
    char y[10];
    char z[10];
    x[0] = x[1] = x[5] = 'a';
    memcpy(y,x,10);
    strcpy(z,x);
    printf ("y[5]= %s\n", &y[5]);
    printf ("z[5]= %s\n", &z[5]);
    return 0;
}

結果は次のとおりです。

y[5]= a
z[5]=

したがって、memcpy がバイト [5] を含む全体の長さを移動したことは明らかですが、strcpy は移動せず、null 終端で停止しました。

于 2013-10-24T18:05:43.047 に答える
1
const char* vendorChar = [vendorId cStringUsingEncoding: [NSString defaultCStringEncoding]];
const char* userChar = [dsUsername cStringUsingEncoding: [NSString defaultCStringEncoding]];

char usernameString[strlen(vendorChar) + strlen(userChar) + 2];
char* uPtr = usernameString;

strcpy(uPtr, vendorChar);
memcpy(uPtr+strlen(vendorChar)+1, userChar, strlen(userChar) + 1);

\0変更: 末尾にスペースを追加しました。文字列は末尾を含めてuserCharコピーされます。\0

于 2013-10-24T18:06:42.653 に答える