C言語を始めたばかりの無知な自分で申し訳ないのですが学校で課題が出て分からなくて困っています。
課題は任意の長さの文字列(英字のみ)データをファイルから読み込み、辞書順に並べ替えるプログラムの作成です。文字列の最大長は64、データの最大個数は1000です。
一応自分で以下の状態まで作成したのですが、データが1000まで読み込んでくれません。申し訳ありませんが締め切りは明日なのでなるべく早くよろしくお願いします。
#include<stdio.h>
#include<string.h>
#include<strings.h>
#define MAX 67
int main(void)
{
FILE *fp;
char ex[1000][MAX],tmp[MAX],a[100];
int i,j,b;
printf("Input filename:");
scanf("%s",a);
fp = fopen(a,"r");
if(fp == NULL){
printf("Not open\n");
}
for(i=0;!feof(fp);i++){
fgets(ex[i],MAX,fp);
}
for(i=0;i<=MAX-2;i++){
for(j=i+1;j<=MAX-1;j++){
b = strcasecmp(ex[i],ex[j]);
if(b>0){
strcpy(tmp,ex[i]);
strcpy(ex[i],ex[j]);
strcpy(ex[j],tmp);
}
if(b==0 && *ex[i]<='z' && *ex[i]>='a' && *ex[j]<='Z' && *ex[j]>='A'){
strcpy(tmp,ex[i]);
strcpy(ex[i],ex[j]);
strcpy(ex[j],tmp);
}
}
}
for(i=0;i<=MAX-1;i++){
printf("%s",ex[i]);
}
fclose(fp);
return 0;
}
No.5ベストアンサー
- 回答日時:
バージョンによるかもしれませんが。
BorlandCで strings.hとstrcasecmpはエラーになりませんか。存在しないようなので。
strcasecmpをstrcmpにして通しましたけど。
1 メモリモデルはラージにしておきましょう。
char ex[E_sizeMax][E_subMax] が大きいです。
2 char ex[E_sizeMax][E_subMax]はmainの外に出した方がよいです。
3 printf("Not open\n");
の下に exit()を追加しましょう。
ファイルが無くてもそのまま進んでしまいますよ。
4 word_num の定義を忘れずに。
5 malloc はHelpを読みましょう。
例
#include<mem.h>
char *cp;
cp=malloc(E_sizeMax * E_subMax );//メモリ確保
if(cp!=NULL){
for(i=0; i<E_sizeMax; i+=E_subMax ){
cp[i] =i; //以下も同じ位置のアクセスです。
*(cp+i) =i;//どれもE_subMax 毎にiを書いています。
//ただし*cpはcharなのでintの下位8bitしか 書き込めませんが。
}
free(cp); //メモリ解放
}
PCのOS上で動かす場合と組み込みCPUでOSなしの場合などメモリ環境により変数の確保の仕方も変わりますのでそれに応じて考えなければなりません。
No.3
- 回答日時:
> 「読み込んだ単語の個数」ということは、3つのforは以下のようにすればいいのでしょうか?
> for(i=0;i<=998;i++)
必ず1000個読み込むというのならそれでよいのかもしれませんが(あまり良くないけど)、
1000個読み込むと決まっているわけではないですよね?
普通は、読み込んだ単語の数を数えておいてそれを使うと思います。
#define E_sizeMax 1000
#define E_subMax 67
for(i=0; i<E_sizeMax; i++){
if( feof(fp) ){break;}
fgets(ex[i],E_subMax,fp);
}
word_num=i; /*word_numに読み込んだ単語数が入る*/
なお効率を考えると、
strcpyで文字列を入れ替えるのではなく、
文字列へのポインタだけを入れ替えた方が良さそうです。
(効率の問題なのでそのままでも動作には問題ないと思いますが。)
この回答への補足
度々の質問で恐縮です。
現在コンパイルできないのですがこのような感じでよろしいのでしょうか。
#include<stdio.h>
#include<string.h>
#include<strings.h>
#define E_sizeMax 1000
#define E_subMax 67
int main(void)
{
FILE *fp;
char ex[E_sizeMax][E_subMax],tmp[E_subMax],a[100];
int i,j,b;
printf("Input filename:");
scanf("%s",a);
fp = fopen(a,"r");
if(fp == NULL){
printf("Not open\n");
}
for(i=0; i<E_sizeMax; i++){
if( feof(fp) ){
break;
}
fgets(ex[i],E_subMax,fp);
}
word_num=i;
for(i=0;i<=word_num-1;i++){
for(j=i+1;j<=word_num;j++){
b = strcasecmp(ex[i],ex[j]);
if(b>0){
strcpy(tmp,ex[i]);
strcpy(ex[i],ex[j]);
strcpy(ex[j],tmp);
}
if(b==0 && *ex[i]<='z' && *ex[i]>='a' && *ex[j]<='Z' && *ex[j]>='A'){
strcpy(tmp,ex[i]);
strcpy(ex[i],ex[j]);
strcpy(ex[j],tmp);
}
}
}
for(i=0;i<=word_num-1;i++){
printf("%s",ex[i]);
}
fclose(fp);
return 0;
}
No.2
- 回答日時:
とにかくCは「安全に」を心がけて書きましょう。
>char ex[1000][MAX]
67*1000 だから67000byteですよ。
サイズが大きい変数は内部変数ではない方が安全ですよ。
またはmallocでメモリ確保してポインタで処理するのが定石です。
いつも実行環境のスタックサイズを忘れずに。
32bitでコンパイルすれば取りあえず読み込めるみたいですがメモリモデルには注意しましょう。
>for(i=0;!feof(fp);i++){
これでは1000回で止まる補償がないのでループはあくまでも同じ次元で処理するため配列のサイズにしましょう。
その上でforの中で!feof(fp)によりBreakすべきです。
例
#define E_sizeMax 1000
#define E_subMax 67
char ex[E_sizeMax][E_subMax]
for(i=0; (E_sizeMax-1) ;i++){
if(!feof(fp){
}else{
break;
}
}
この回答への補足
超未熟者の自分にはちょっと難しい気がします。
mallocって???って感じの状態なんで。
出来れば自分なんかで分かるよう具体的に教えていただけないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Visual Basic(VBA) 【マクロ】フォルダにファイルが1つも無い時に、ファイルがありませんとメッセージを表示する 4 2022/08/28 08:48
- Excel(エクセル) マクロのコードを、少しでも削って短くしたい 3 2022/08/30 07:46
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
なぜCSQとCIP形式ではコ...
-
複数ファイルの同時読み込みの...
-
ファイルが読み込めない・・・
-
c言語 ファイルから数字を読み...
-
日本語ファイル名のFTPについて
-
C言語を用いて、csvファイル内...
-
fgets( ) の返り値は何?
-
ガンマ変換 C言語でプログラ...
-
C言語でのCSVソートとデータ抽...
-
C言語でファイル読み書きを早く...
-
構造体とファイル検索(><)
-
音声データを出力するCプログラ...
-
lockfについて
-
画像を読み込み、画素値の度数...
-
ファイルへの書込み処理が異常...
-
乱数とファイルの入出力の質問...
-
csvfファイルの1行目と3行目を...
-
テキストファイル内に対して, ...
-
C言語におけるファイル読み込み...
-
#define _CRT_SECURE_NO_WARNIN...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語でのfscanfについて
-
C言語でファイル読み書きを早く...
-
fopenでファイル名に、変数を使...
-
複数ファイルの同時読み込みの...
-
fgets( ) の返り値は何?
-
テキストファイル内に対して, ...
-
ファイルへの書込み処理が異常...
-
C言語にてXMLファイルから任意...
-
ファイル出力で改行を入れたい!
-
C言語でセグメンテーションエ...
-
エラーがわかりません、、
-
ガンマ変換 C言語でプログラ...
-
自己相関関数を求めるプログラ...
-
VisualStudioでのファイルの入...
-
同時にファイル読み込み 書き込み
-
c言語 ファイルから数字を読み...
-
大量の入力ファイルを扱うとき...
-
ファイルが読み込めない・・・
-
【C言語】ファイルを読み込んで...
-
a*(1-exp(-bx))+cの近似の方法
おすすめ情報