- ベストアンサー
配列の要素数が変化する・・・
自分ではどうしても解決不可につき、教えてください。 main関数で入力文字列「input」の要素数は256なのに、検索キー入力チェック関数で出力引数となるポインタ「pOutInput」の要素数は4なんです…。 ちなみにこれが4だと、fgetsで5文字('\n'を除くと4文字)読み込みたいのに、fgetsが2回読み込みに行ってしまうんです。 fgetsの読み込み数を10など、5文字以上に指定すれば読み込めますが、sizeof(pOutInput)の4を超えているので、ホントはよろしくないはずですよね? sizeof(pOutInput)がmain関数と同じ256になる方法、教えていただけますでしょうか? よろしくお願いします!! //main関数 int main() { char input[256]; /* 入力文字列input */ /* 検索キー入力チェック関数呼び出し */ InputSchKeyCk(input); printf("kekka:%s\n", input); return 0; } //検索キー入力チェック関数 int InputSchKeyCk(char* pOutInput) { /**== 変数宣言 ==**/ int flgInput; /* 入力続行フラグ */ /**== 初期化処理 ==**/ flgInput = 1; /**== 入力チェック処理 ==**/ /* 入力続行フラグが入力続行の限りループ */ while(flgInput == 1) { /* 入力社員IDをキーボード入力受付 */ printf("検索対象社員の4桁の社員IDを入力してください。\n"); fgets(pOutInput, sizeof(pOutInput), stdin); /* 入力社員IDの文字長が4以下、または6以上 */ if(strlen(pOutInput) != 5) { /* 画面にエラーメッセージ出力 */ printf("社員IDは4桁で入力してください。\n"); } else { /* 入力続行フラグに入力中断を代入 */ flgInput = 0; } } /**== 正常終了 ==**/ return 0; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちわ。 > main関数で入力文字列「input」の要素数は256なのに、 > 検索キー入力チェック関数で出力引数となるポインタ > 「pOutInput」の要素数は4なんです…。 InputSchKeyCk 関数内でsizeof しているのは、単なるポインタ なので4 Byte と判断しているだけです。 要は領域をアドレスだけ渡されたのでは、渡された方はどれだけの 領域がとられているか分からないと言う事です。 解決方法としては、 1. InputSchKeyCk 関数にinput 領域のサイズも一緒に渡してやる。 2. 「#define BUFFER_SIZE 256」と宣言して、main 関数での領域確保 は、char input[BUFFER_SIZE] とする。 → InputSchKeyCk 関数では、sizeof() を使わずに、 BUFFER_SIZE を使う。 3. input 変数をグローバルにして、sizeof(input) とする。 等の方法があります。 私としては、2 がお奨めですね。
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1-1に一票
お礼
BLUEPIXYさんも、ありがとうございました。 また何かあったら、よろしくお願いしますね!!
お礼
muyoshidさんっっ、的を得た答えをホントにありがとうございました!! muyoshidさんオススメの2番の方法でやってみました。 ばっちりできました。 ちなみにこの関数が何の目的のmain関数の一部だったかというと・・・ 「社員IDと社員名が入ったテキストファイルを読み込んで構造体に格納し、さらに検索する」関数の社員IDの"文字数チェック"だったワケです。 おかげさまで全部コーディングでき、正常に動いてくれました☆ この関数、ユーザ定義関数が4つあるんですけど、ユーザ定義関数があって正常動作してくれたの、今回が初めてなんです!! すごくうれしかった~!! muyoshidさん、最後にもう一度、ありがとうございました!!!