• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c言語で質問なのですが )

C言語で構造体配列にふりがなを登録する際の文字制限について

このQ&Aのポイント
  • C言語で構造体配列にふりがなを登録する際に、25文字を超える場合に登録できないようにしたいのですが、うまく制御できません。
  • 試みとしてif文で制御していますが、fgetsを使用した時点で文字が格納されてしまうため、制御がうまくいきません。
  • どなたか、この問題の解決方法を教えていただけませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>この場合fgetsを使った時点で格納されているのでしょうか? 格納されてしまいます。 しかし、添え字のiをカウントUPしなければ、もう一度同じ場所に読み込んでくれますので、それで対処できるのでは? おそらく、このプログラム全体が for(i=0;i<MAX;i++) //MAXは要素数 などで囲まれていると思いますが、そこを、 for(i=0;i<MAX;) とし、 if(strlen(p[i].huri)>25) { puts("<<文字入力数が多すぎでしょうあんた>>"); puts("何かキーを押してください"); getchar(); system("cls"); continue; } のあとで、 i++ すればよいのではないでしょうか? つまり、25文字以上ならiをインクリメントしないということです。

armpoint
質問者

お礼

ありがとうございます。 プログラムからiがカウントアップされていることを予測され、さらに指摘してくださるなんて感激です。 おかげさまで何とかできましたありがとうございます。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ついでにいうと, このままでいくと getchar がスルーされる (ように見える) ような気がする.

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

fgetsの関数仕様嫁としか… p[i].huriのサイズ分までは読み込みますから25バイト以上の配列が宣言されていれば当然、そのサイズ分までは読み込まれます。 こういうのは長めのバッファを別にとって中身を確認してから構造体にコピーするもんだと思います。 char buf[1024]; fgets(buf,sizeof(buf),stdin); でチェック処理後に strcpy(p[i].huri,buf); とか。

armpoint
質問者

補足

ありがとうございます。 一応このようにやってみました printf("ふりがな:"); fgets( buf,sizeof(buf),stdin); if(strchr(buf,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(buf[strlen(buf)-1]=='\n')//改行解除 { buf[strlen(buf)-1] = '\0'; } if(strlen(buf)>25) { puts("<<文字入力数が多すぎでしょうあんた>>"); puts("何かキーを押してください"); getchar(); system("cls"); continue; } else{ strcpy(p[i].huri,buf); } このままでは警告がでるのと 25以上入力したあと25文字以下で入力するとうまく表示できません。 なぜでしょうか?

関連するQ&A

専門家に質問してみよう