C言語で、指定の文字列を超えた入力がされた時、fgets関数を用いてエラーと表示したいです。
includeするのは<stdio.h>のみという条件です。
wikipediaでは、
char a[20];
if (fgets(a, 20, stdin) == NULL) {
// エラー処理
}
のように紹介されていますが、エラー処理のところに
printf("Error");として、20文字以上入力しても、エラーが表示されません。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
指定の文字列を超えた入力がされた時
fgets()では、指定した範囲を超えては入力が為されないので、関数としてはエラーにはなりません。
fgets()は入力データから改行が得られるかあるいは指定文字数に達するかまで取り込むだけ。指定文字数以上のデータが入力ストリームにあることは正常に想定される事態であってエラーではありません。
したがって、質問にいう「エラー」とは入力された文字列をあなたがエラーとみなすかどうかというだけの話なので、入力された文字列をあなたが検査して下さい。先頭から指定文字数まで一文字ずつ'\n'なのか、'\0'なのか、それともそれ以外なのかに応じて適切に処理すればわかるでしょう。文字数を数える必要もありません。
for(int i=0; i<20; i++){//0から19まで順に if(a[i]=='\n'){//好みならswitch文とかを使ってもいいけど //'\n'に出会ったということは「エラー」ではなかったということだから、ループを抜ければいい } if(a[i]=='\0'){ //'\n'に出会うこと無く文字列が終わったということは、入力に指定文字数以上あったということ。 } //それ以外だった }
投稿2020/04/29 04:27
総合スコア7703
0
majiponi さんの回答はいいアイデアですが、
fgets の引数の順序が間違っているのと、
エラーの場合のリカバリがないので、複数行の読み込みができません。
そこで、次のようなコードを書いてみました。
C
1#include <stdio.h> 2 3#define N 20 4 5int main(void) 6{ 7 char s[N]; 8 while (s[N-2] = '\0', fgets(s, N, stdin)) { 9 if (s[N-2] != '\0' && s[N-2] != '\n') { 10 puts("Error"); 11 int c; 12 while ((c = getchar()) != EOF && c != '\n') ; 13 } 14 else 15 fputs(s, stdout); 16 } 17}
投稿2020/04/29 13:01
総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
includeするのは<stdio.h>のみ
string.h がダメというのであれば, (20バイト限定の) strlen 相当を自作すれば良いのではないでしょうか.
課題の趣旨がその辺りにあるのかもしれませんし, そもそも課題を質問するのはダメでしょう.
投稿2020/04/29 03:33
編集2020/04/29 03:34総合スコア13209
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C
1int fgetshortline(FILE* fp, char* buf, int n) 2{ 3 buf[n-2] = '\0'; 4 return fgets(fp, buf, n) && (!buf[n-2] || buf[n-2] == '\n'); 5} 6 7char buf[21]; 8if(!fgetshortline(stdin, buf, sizeof(buf))){ 9 /* too long, or io error */ 10}
動くかどうかは試してませんが、こんな感じでしょうか?
投稿2020/04/29 10:46
総合スコア1722
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
18文字以下の入力の場合、入力した文字列の最後に\n
(改行)と\0
の2バイトが続きます。
strlen(a)
は入力した文字数+改行文字の1です。
19文字以上の入力の場合、入力した文字列の先頭19文字の後、つまりa[19]
に\0
が入ります。
strlen(a)
は、19です。
なので、a[strlen(a)-1]
が\n
かどうか調べればどちらか分かります。
20文字目以降の入力していない文字列は次の入力関数の実行で取得されます。
投稿2020/04/29 03:24
総合スコア85901
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/29 03:34
2020/04/29 04:34
2020/04/29 04:35
2020/04/29 04:37
2020/04/29 04:56
2020/04/29 05:10
2020/04/29 12:26
2020/04/29 12:35
0
指定文字数以上入力された場合、文字列終端の'\0'がつかないので、そこらへんを見ればいいんじゃないかと。
strlen(a)が20以上のときにエラーを出しましょう
投稿2020/04/29 03:16
編集2020/04/29 03:18総合スコア88042
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/29 03:19
2020/04/29 03:20
2020/04/29 03:23
2020/04/29 03:31
2020/04/29 04:37
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。