• ベストアンサー

大文字を小文字に変換するプログラム

if((fp4 = fopen("sample.txt","r")) == NULL){ printf("can't open\n"); return(-1);//強制終了 } else{ while((c=fgetc(fp4))!=EOF){/*EOFまでfp4に入力*/ if(isupper(c)){ c=tolower(c); printf("%s",c); } else printf("a"); //確認用 } } ファイルから文字を読み込んでctype関数を使って大文字から小文字に変換したいんですがうまくいきません。 コンパイルしても確認用が反応しないんでおそらくどこか間違ってると思うんですがわかりません。 ご教授宜しくお願いします。

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

  • ベストアンサー
noname#30727
noname#30727
回答No.6

>if((fp3 = fopen("sample.txt","w")) == NULL){ >if((fp4 = fopen("sample.txt","r")) == NULL){ >fclose(fp4); >fclose(fp3); これはちょっと怪しいですね。↓のように書き込みが終わったらすぐにクローズした方が確実です。 >if((fp3 = fopen("sample.txt","w")) == NULL){ >fclose(fp3); >if((fp4 = fopen("sample.txt","r")) == NULL){ >fclose(fp4);

newcolleger
質問者

お礼

コンパイルできました。 すぐ閉じないといけないんですね。 ためになりました。 ありがとうございました。

その他の回答 (5)

  • pascal01
  • ベストアンサー率28% (18/63)
回答No.5

変数 c の型定義が間違っているのでしょう。 見直してください。

newcolleger
質問者

お礼

変数cはint型ですよね。 ありがとうございました。

回答No.4

sample.txtと結果を示した方が良いですね。 #2さんも指摘されてますが printf("a"); //確認用 の意図が全く理解できません。何のためにしているのでしょう?

newcolleger
質問者

お礼

if文のisupperでひっかかってるかどうか確認するために打ってみました^^;

newcolleger
質問者

補足

if((fp4 = fopen("sample.txt","r")) == NULL){ printf("can't open\n"); } else{ while((c=fgetc(fp4)) != EOF){ if(isupper(c)){ c = tolower(c); } } printf("%c",c); }  } いろいろ改良した結果結局これになりました…ができません。 cはint型でOKですよね? 警告 W8004 report.c 77: 'd' に代入した値は使われていない(関数 main ) と出ます(|| ゜Д゜)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

まず問題点の切り分けを行いましょう。 以下のプログラムを実行してください。 #include <stdio.h> #include <ctype.h> int main(void) { int c = 'A'; printf ("元の値=%c\n",c); if (isupper(c)){ printf("大文字である\n"); c = tolower(c); printf ("変換後の値=%c\n",c); }else{ printf("大文字でない\n"); } return 0; } この結果、 元の値=A 大文字である 変換後の値=a が表示されれば、正しくctype関数が機能しています。 windows2000,ボーランドCで確認した結果は、正常に動作しています。(当方の環境) もし、これが正しく動作しないなら、 あなたの使用しているOS、コンパイラの種類を提示してください。

newcolleger
質問者

お礼

% gcc -o a a.c % ./a 元の値=A 大文字である 変換後の値=a % ctype関数うまくいってるみたいです。 もうすこし考えてみます・・・

  • wakin
  • ベストアンサー率16% (7/42)
回答No.2

if(isupper(c)){   c=tolower(c);   printf("%c",c); } else   printf("a"); //確認用 読み込んだ文字が小文字の場合は何も出力しないのですか?(確認用で"a"が出るようになってますけど) if(isupper(c))   c=tolower(c); else   printf("a"); //確認用 printf("%c",c); こうでは?

newcolleger
質問者

お礼

読み込んだ文字が小文字の場合も出力したいんですが、 何も表示されないんでまず大文字を小文字に変える所からしようかなと。 よろしくおねがいします。

newcolleger
質問者

補足

CTYPEじゃないほうも作ってみました、、 何も表示されません^^; #include<stdio.h> #include<ctype.h> #define M 10 struct data{//構造体宣言 char author[100]; char title[100]; char publisher[100]; int year; }book[10],tmp; int main(void)//main関数 { FILE *fp1,*fp2,*fp3,*fp4;//ファイルの宣言 int i,j,k;//for文の時に使用 char c[5]; char d[100]; if((fp1 = fopen("biblio.txt","r")) == NULL){ printf("can't open"); return(-1);//強制終了 } else{ for(i=0;i<M;i++){ fscanf(fp1,"%[^,],%[^,],%[^,],%d%*c",book[i].author,book[i].title,book[i].publisher,&book[i].year); } } for(j=0;j<M;j++){ for(k=0;k<M;k++){ if(j<=k){//これを書かないと降順になってしまう。(j=2、k=0の時また交換されてしまう。) if(book[j].year < book[k].year){//もし発行年が次の構造体の発行年より大きかったら tmp=book[j]; book[j]=book[k]; book[k]=tmp; } } } } if((fp2 = fopen("formatted.txt","w")) == NULL){ printf("can't open\n"); return(-1);//強制終了 } else{ for(i=0;i<M;i++){ fprintf(fp2,"Author :%s\n Title :%s\n Publisher :%s\n Year :%d\n\n ",book[i].author,book[i].title,book[i].publisher,book[i].year); } } if((fp3 = fopen("sample.txt","w")) == NULL){ printf("can't open"); return(-1);//強制終了 } else{//タイトルだけをサンプルに書き出す for(i=0;i<M;i++){ fprintf(fp3,"%s",book[i].title); } } if((fp4 = fopen("sample.txt","r")) == NULL){ printf("can't open\n"); return(-1);//強制終了 } else{ while(fscanf(fp4,"%s%c",&c,&d)!=EOF){/*EOFまでfp3に入力*/ if(c[0]>=65 && c[0]<=90){/*大文字表記なら小文字表記に変換*/ c[0]+=32; printf("%s",c); } } } fclose(fp4); fclose(fp3); fclose(fp2); fclose(fp1); return(0);//正常終了 }

回答No.1

printf の %s は文字列(charのポインタ)なので、 %c ではないですか?

newcolleger
質問者

お礼

早速回答ありがとうございます。 %cに変更してみましたが、やはりできません。 Problem Solving and Program Design in CC : A Reference ManualC Primer PlusC How to ProgramC Programming for Engineering and Computer ScienceIntroduction to CProgramming Embedded Systems in C and C++Absolute Beginner's Guide to CNumerical Recipes in C : The Art of Scientific ComputingThe C Programming Language これがsampleのなかに入ってるんですが、ctypeじゃ無理ですかね。。

newcolleger
質問者

補足

前の部分のソースです #include<stdio.h> #include<ctype.h> #define M 10 struct data{//構造体宣言 char author[100]; char title[100]; char publisher[100]; int year; }book[10],tmp; int main(void)//main関数 { FILE *fp1,*fp2,*fp3,*fp4,*fp5;//ファイルの宣言 int i,j,k;//for文の時に使用 int c; if((fp1 = fopen("biblio.txt","r")) == NULL){ printf("can't open"); return(-1);//強制終了 } else{ for(i=0;i<M;i++){ fscanf(fp1,"%[^,],%[^,],%[^,],%d%*c",book[i].author,book[i].title,book[i].publisher,&book[i].year); } } for(j=0;j<M;j++){ for(k=0;k<M;k++){ if(j<=k){//これを書かないと降順になってしまう。(j=2、k=0の時また交換されてしまう。) if(book[j].year < book[k].year){//もし発行年が次の構造体の発行年より大きかったら tmp=book[j]; book[j]=book[k]; book[k]=tmp; } } } } if((fp2 = fopen("formatted.txt","w")) == NULL){ printf("can't open\n"); return(-1);//強制終了 } else{ for(i=0;i<M;i++){ fprintf(fp2,"Author :%s\n Title :%s\n Publisher :%s\n Year :%d\n\n ",book[i].author,book[i].title,book[i].publisher,book[i].year); } } if((fp3 = fopen("sample.txt","w")) == NULL){ printf("can't open"); return(-1);//強制終了 } else{//タイトルだけをサンプルに書き出す for(i=0;i<M;i++){ fprintf(fp3,"%s",book[i].title); } }

関連するQ&A