アプリ版:「スタンプのみでお礼する」機能のリリースについて

BUF_SIZE文字以上ある行を読み込もうとしたら、 エラーメッセージを表示してその場で終了するコードを書く。 たとえば、BUF_SIZEを6に設定して、
k.txt
1
22
333
4444
55555
666666
7777777
88888888
999999999
を入力したときには次のように表示するようにする。
1
22
333
line:4:can't input whole characters.

上のような問題で、下のようにコードを書いたのですが、「else if(〜〜)」の部分で、どのように条件式を記述すれば分からないです。至急、ご教授お願い致します。

#include<stdio.h>
#include<stdlib.h>

#define BUF_SIZE 5

int main(void){
FILE *fp;
const char *fname="k.txt";
char buf[BUF_SIZE];
char *z;

fp=fopen(fname, "r");
if(fp==NULL){
printf("Can't Open File %s\n", fname);
exit(1);
}


int i=0;
while(1){
z=fgets(buf, BUF_SIZE, fp);
if(ch==NULL){
break;
}

else if(〜〜){
printf("line:%d入力できないです。",i+1);
exit(1);
}
else{
printf("%s", buf);
i++;
}
}

fclose(fp);
return 0;
}

A 回答 (3件)

bufに読み込んだ最後の文字が改行でないなら、読み込めなかったと判断します。


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define BUF_SIZE 5

int main(void)
{
FILE *fp;
const char *fname = "k.txt";
char buf[BUF_SIZE];
char *z;

fp = fopen(fname, "r");
if (fp == NULL) {
printf("Can't Open File %s\n", fname);
exit(1);
}


int i = 0;
while (1) {
z = fgets(buf, BUF_SIZE, fp);
if (z == NULL) {
break;
}
int ll = strlen(buf);
if (buf[ll-1] != '\n'){
printf("line:%d入力できないです。", i + 1);
exit(1);
} else {
printf("%s", buf);
i++;
}
}

fclose(fp);
return 0;
}
    • good
    • 0

「BUF_SIZEを6に設定して」と「#define BUF_SIZE 5」とその結果とがどのように関係しているのかを明確にしないと, 「問題としては」不十分じゃないかねぇ.



と指摘しておいて, と.

それだとまずいケースがあるので長さもチェックしてやってくださいな>#2.

しかし, なんでそんなところで i をインクリメントしてるんだろうか.
    • good
    • 0

#define BUF_SIZE 5 → 6 ではないですか。

5でいいですか。
char buf[BUF_SIZE +1]; BUF_SIZE 5の場合。
z=fgets(buf, BUF_SIZE +1, fp);BUF_SIZE 5の場合。
else if(〜〜){

else if(i>BUF_SIZE){ //BUF_SIZE=6 の場合
else if(i>BUF_SIZE+1){ //BUF_SIZE=5 の場合

ではどうでしょうか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!