1

型キャスト後に、構造体の一部の要素に正しい方法でアクセスする際に問題があります。ここに私のコード:

void get_description(struct shmstruct *ptr/*, int number*/) {
    char buff[MESGSIZE];
    struct shmData *dparse;
    snprintf(buff, MESGSIZE, "%s", &ptr->msgdata[0]);
    dparse = (struct shmData *) buff;
    printf("Number: %s", dparse->number);
    printf("Description: %s", dparse->description);
}

問題は、123 のような番号だけでなく、最初の行の説明も取得することです ->
printf("Number: %s", dparse->number);
いいね: 123 説明

番号だけを取得するにはどうすればよいですか?

(追伸

struct shmData{
    char number[4];
    char description[1020];
};

)

4

1 に答える 1

1

番号はnullで終了していないようです。あなたはnumberフィールドを持っていて、その直後にあなたはdescriptionフィールドを持っています。 printf()nulで終了する文字列を指定していると想定し、終了するnul文字に到達するまで続行します。あなたの場合のように見えますが、numberフィールドを終了するヌルはないのでprintf()、そのまま続けて取得しdescriptionます。

4文字すべてnumberを数字に使用できますか?

number数字が3桁以下の場合は、終了ヌルをバッファーに入れることができます。そこから4桁の数字を読み取る必要がある場合は、数字を少なくとも5文字の一時バッファーにコピーしてから、nul-terminateする必要があります。

// max 3 digits:
dparse->number[3] = '\0'; // ensure nul-termination of number

// max 4 digits:
#define DPARSE_NUMBER 4  /* size of number field in dparse */
char temp[DPARSE_NUMBER + 1];
strncpy(temp, dparse->number, sizeof(temp));
temp[sizeof(temp) - 1] = '\0'; // strncpy() does not guarantee to nul-terminate, so we must do this

strncpy()残念ながら、nul-terminateを保証するものではありません。したがって、常に最後の位置に終了ヌル文字を入れて、何があってもそれがヌル終了になるようにする必要があります。strncpy()時々私たちのためにnulを置くことに注意してください、しかしそれがそこにあることを確認することは害はありません。

于 2013-01-12T01:29:55.213 に答える