2010-11-18 6 views
1

私はプログラムのシェルを与えられており、いくつかの機能を記入する必要があります。strncopy n文字以上をコピーする

私は与えられた2つの構造体を自動的に作成し、定義しなければならない関数に渡します。

typedef struct { 
    char data[20]; 
} msg; 

typedef struct { 
    int seqnum; 
    int acknum; 
    int checksum; 
    char payload[20]; 
} pkt; 

は、私はこの機能fooを定義する必要があり、そのようにそれを作成していると言う:その関数が呼び出されると

void foo(msg message) { 
    printf("%s\n", message.data); 
} 

、それはddddddddddddddddddddôÑ@<úHn½*Ìå«*¤ú¤F«*を出力します。私が間違っていない限り、20文字しか保持できないはずですか?私は実際にmsgを作成していません。

msg.datapkt.payloadにコピーすると、それは見知らぬ人になります。

void foo(msg message) { 
    pkt packet; 
    strncpy(packet.payload, message.data, sizeof(packet.payload)); 
    printf("%s\n", message.data); 
    printf("%s\n", packet.payload); 
} 

message.data前と同じように出力しますが、eeeeeeeeeeeeeeeeeeee<úeeeeeeeeeeeeeeeeeeee²[email protected]<úHn½*Ìå«*¤ú¤F«*をpacket.payload出力します。なぜ20文字以上ですか?

これはCを使用した初めてのことですので、これが明らかな場合は私を許してください。しかし、私は言語に問題があるので、割り当ての中核に到達することすらできません。

+0

あなたはそれがヌルで終了ではないかもしれない20バイトのフィールドで仕事をしたい場合は、 ''あなたのprintf'フォーマット文字列の%.20s'を使用してください。 –

答えて

2

%s指定子を持つprintf()は、ゼロ終了文字列を送信していることを前提としています。したがって、ゼロ(または'\0')が見つかるまで、メモリ内のバイトを読み取ります。

strncpyは、n文字に達する前にソース文字列にゼロがない限り、宛先文字列にゼロを追加しません(その時点で、残りの宛先文字列は0で埋められます)。ゼロ終端)。

+2

正確には、ソース文字列がn文字以上の場合、 'strncpy'はターゲット文字列に0を付加しません。 – Arkku

+0

@Arkku:確かに、私は編集しました。 –

2

strncpyコピー中の文字列は終了しません。

あなたはどちらか

strncpy(packet.payload, message.data, sizeof(packet.payload) - 1); 
packet.payload[sizeof(packet.payload) - 1] = '\0'; 
printf("%s\n", message.data); 
printf("%s\n", packet.payload); 

または固定サイズの潜在的に終端されていない文字列として扱い、フィールドを手動で終了する必要があります。

strncpy(packet.payload, message.data, sizeof(packet.payload)); 
printf("%s\n", message.data); 
printf("%.*s\n", sizeof packet.payload, packet.payload); 

また、あなたはそれがsnprintf(C99で終了しておくこと)は、文字列を常に終了させるため、エラーの発生が少なくなります。

snprintf(packet.payload, sizeof packet.payload, "%s", message.data); 
printf("%s\n", message.data); 
printf("%s\n", packet.payload); 
0
strncpy(packet.payload, message.data, sizeof(packet.payload)); 
packet.payload[sizeof(packet.payload) - 1] = 0; 
関連する問題