2011-07-07 8 views
0

こんにちは私は - charを見つけようとしていて、一番左の文字を文字列に入れようとしています。私は私の出力結果、このコードを実行すると、ここで私がFUPOPERがprogram_id_DBに保存することがしたい、しかし:Strchrとstrncpy誤使用

Character '-' found at position 8. 

prgmidはFUPOPERL < -whereが、それはこのリットルを得ている含まれています?!?!

char data_DB[]="FUPOPER-$DSMSCM.OPER*.FUP"; 

char program_id_DB[10]; 

char program_name_DB_c[ZSYS_VAL_LEN_FILENAME]; 

char *pos = strchr(data_DB, '-'); 

if (pos) 
    strncpy(program_id_DB,data_DB, pos-data_DB); 


printf("Character '-' found at position %d.\n", pos-data_DB+1); 

printf("The prgmid contains %s\n",program_id_DB); 

答えて

1

program_id_DBを初期化していないため、必要なものを自由に入れることができます。実際に

memset(program_id_DB, 0, 10); 

を文字列は、あなたがprintfに渡すという保証はありませんので、何をやっていることはそれほど危険である(あなたがmemsetため#include <string.h>する必要があります。):あなたが開始する前にそれをゼロに設定してくださいヌル終了です!使用する前には常に配列をゼロにし、最大で9個の非ヌル文字をコピーしてください。

+0

ありがとうございます!そんなに! – Ken

0

\0を入力して文字列の終わりをマークする必要があります。

これを行う方法は、memset(program_id_DB, 0, sizeof(program_id_DB));の前にstrncpyにしてください。

+0

ありがとう!そんなに! – Ken

+0

あなたは歓迎です:) –

0

あなたはすでにすなわち、あなたのケースでは、あなたがの合計をコピーしている(N文字をコピーした場合、あなたのためにこれを自動的に行いませんstrncpyとしてprogram_id_DB文字列の末尾のヌル終端文字を追加する必要が8文字以上であるため、7文字以上をコピーすると、ヌル終端文字はバッファにコピーされません)。いずれか、またはstrncpyと使用する前に、program-id_DB文字列をmemsetでゼロ初期化してください。

0

strncpyは雌犬です!

文字列を終了しません。自分で文字列を終了する必要があります。

if (pos) { 
    strncpy(program_id_DB,data_DB, pos-data_DB); 
    program_id_DB[pos - data_DB] = 0; 
} 

文字列が小さすぎる場合、strncpyは剰余を0に設定します。

strncpy(dst, src, 1000); /* always writes 1000 bytes, whether it needs to */ 
関連する問題