-2
ユーザーが導入した値をスキャンして別の関数に* sizeポインタを渡すと、文字(book._title)のガベージ値が発生します。 なぜ私は本当に理解できません。私はC言語のプログラミングでは新しいので、何か助けていただければ幸いです。ありがとう。それをスキャンして別の関数へのポインタで渡すときにガベージ値が得られる
void addBook(struct Book book[], int *size) {
if(*size < MAX_BOOKS){
printf("ISBN: ");
scanf("%d", &book[*size]._isbn);
printf("Title: ");
scanf("%*c%[^\n]", &book[*size]._title[MAX_TITLE_SIZE]);
printf("Year: ");
scanf("%d", &book[*size]._year);
printf("Price: ");
scanf("%f", &book[*size]._price);
printf("Quantity: ");
scanf("%d", &book[*size]._qty);
printf("The book is successfully added to the inventory.\n");
printf("\n");
(*size)++;
}
else {
printf("The inventory is full\n");
}
}
'_title [MAX_TITLE_SIZE]'は 'char'配列の範囲外のインデックスに似ています。それはどういう意味ですか? –
この行: 'scanf("%d "、&book [* size] ._ isbn);は投稿されたコードの問題の1つです。ここには典型的なISBNがあります: '978-1-59327-220-3'まず、' scanf() 'の呼び出しは、操作が成功したことを保証するために戻り値(パラメータ値ではない)を持っていたはずです。 。さらに重要なのは、 '%d'は先頭の+/- charを入力して(オプションで)最大##########文字までの数字までを入力し、 +/- 2ギグ。典型的なISBN 9gigは大きすぎて、数字ではない ' - 'が埋め込まれていることに注意してください。提案: 'scanf()'を呼び出すときに 'scanf("%* c%[^ \ n] "、&book [* size] ._ title [MAX_TITLE_SIZE]);':1)という文字配列 – user3629249
を入力してください。常に操作が成功したことを保証するために戻り値をチェックしてください。 2) '%s'または '%[^ \ n]'入力/変換指定子を使用する場合、常に入力バッファの長さよりも小さいMAX CHARACTERS修飾子を使用します(scanfは常にNULバイトを追加します)ので、入力バッファがオーバーランすることはありません。入力バッファのオーバーランニングは未定義の動作であり、seg faultイベントを引き起こす可能性があります。 – user3629249