report4-1.c |
---|
#include<stdio.h> #include<stdlib.h> #define BUF_SIZE 1024 int main(void){ FILE *fp; const char *filename1="/usr/share/dict/words"; const char *filename2="freqword-linux.txt"; char buf[BUF_SIZE]; char *ch; fp=fopen(filename1, "r"); if(fp==NULL){ printf("File:%s can't open!", filename1); exit(1); } while(1){ ch=fgets(buf, BUF_SIZE, fp); if(ch==NULL){ break; } if(strcmp(buf, "Japan\n")==0){ /********↑"Japan"を探すのでなく、"Japan\n"を探す*****/ printf("%s", buf); } } fclose(fp); fp=fopen(filename2, "r"); if(fp==NULL){ printf("File:%s can't open!", filename2); exit(1); } while(1){ ch=fgets(buf, BUF_SIZE, fp); if(ch==NULL){ break; } if(strcmp(buf, "printf\n")==0){ /********↑"printf"を探すのでなく、"printf\n"を探す*****/ printf("%s", buf); } } fclose(fp); return 0; } |
==
を用いることができない理由を説明してください。
report4-2.c |
---|
#include<stdio.h> #include<stdlib.h> #define BUF_SIZE 1024 int main(void){ FILE *fp; char *filename="Japan.txt"; char buf[BUF_SIZE]; char *target_string="Japan\n"; char *ch; fp=fopen(filename, "r"); if(fp==NULL){ printf("File:%s can't open!", filename); exit(1); } while(1){ ch=fgets(buf, BUF_SIZE, fp); if(ch==NULL){ break; } if(buf==target_string){ printf("%s", buf); } /**** printf("target_string:%s target_string's address:%p\n", target_string, (void *)target_string); printf("buf:%s buf's address:%p\n", buf, (void *)buf); ****/ } fclose(fp); return 0; } |
target_string
と検索先buf
の正体が画面表示されます。
これらはchar型のアドレスを表し、その具体的な値はそれぞれ異なることが分かります。
それらのアドレスにはいずれも文字列"Japan\n"が格納されているという意味では
同じですが、比較演算子ではアドレスを比較するので一致を検出できません。
BUF_SIZE
文字以上ある行を読み込もうとした時点で、
エラーメッセージを表示してその場で(exit
関数を用いて)
終了するようにしてください。
(ヒント:1行BUF_SIZE
文字未満の行を読み込むと、
読み込んだ文字列中に、必ずある文字が含まれています。)
report4-3.c |
---|
#include<stdio.h> #include<stdlib.h> #include<string.h> #define BUF_SIZE 25 int main(void){ FILE *fp; const char *filename="freqword-linux.txt"; char buf[BUF_SIZE]; char *ch; int line=1; char *check_whole_line; fp=fopen(filename, "r"); if(fp==NULL){ printf("Can't Open File %s\n", filename); exit(1); } while(1){ ch=fgets(buf, BUF_SIZE, fp); if(ch==NULL){ break; } check_whole_line=strchr(buf, '\n'); if(check_whole_line==NULL){ printf("%d行目:1行読み込めていません。\n", line); exit(1); } line++; } fclose(fp); return 0; } |
if(strcmp(fgets(buf, BUF_SIZE, fp), "Japan\n")==0){ |
... if(isspace(*buf)!=0) { printf("EROR\n"); exit(1); } ... |