単語を昇順でソートするプログラミングでエラーが出て困っている者です。
エラーが出てる箇所のみ抜粋して、あとは省略したものが下記です。
下記の2つの関数の下の方の関数で
間接参照のレベルが'char **'と'char[10][20]'で異なっています
read_wordsの型が2の仮引数および実引数と異なります
と言うエラーが現れます。main関数内のsortword関数、display_words関数でも同様にエラーが現れます。
これらの原因は何でしょう。また、僕は何がわかってないですか?
ここどこを勉強しろ、等のアドバイスでも結構ですのでぜひご指導ください。お願いします。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LINE_SIZE 20
#define MAX_LINES 10
char line[MAX_LINES][LINE_SIZE];
int num;
int read_words(char *fname,char **line,int num)//用意した構造に文字列を格納
{
FILE *fp;//ファイルポインタの宣言
int i = 0;//繰り返し変数の初期化
if((fp = fopen(fname,"r")) == NULL)//ファイルがあるかの確認
{
printf("ファイルを開けません\n");//ファイルが無い時はエラーメッセージを出す
exit(1);//エラー時は強制終了
}
fp=fopen(fname,"r");
fscan(fp,"%d",&line);
for(i=0;i<MAX_LINES;i++)//1列ずつ文字列を入れる制御構造
{
fscanf(fp,"%s",&line[i]);//ファイルから文字列を変数に入力
i++;//繰り返し変数の増加
}
num=line[0];//単語数を戻り値とする
fclose(fp);//ファイルのクローズ
}
int main(int argc,char *argv[])
{
read_words(argv[1],line,int num);
sortword(line,num);
display_words(line,num);
}
No.3ベストアンサー
- 回答日時:
開発環境が書かれていませんが、書いた方が回答者が回答しやすいと思います。
> int read_words(char *fname,char **line,int num)
この関数の第2引数はchar **型なのに、
> char line[MAX_LINES][LINE_SIZE];
> read_words(argv[1],line,int num);
呼び出すときの型が char[MAX_LINES][LINE_SIZE]型になってしまっています。
関数の引数を以下のどれかに変更すればとりあえずそのエラーは出なくなると思います。
int read_words(char *fname,char line[MAX_LINES][LINE_SIZE] ,int num)
int read_words(char *fname,char line[][LINE_SIZE] ,int num)
int read_words(char *fname,char *line[LINE_SIZE] ,int num)
なお、このことに関する詳しいことは下記のページを見てください。
http://www.st.rim.or.jp/~phinloda/cqa/cqa17.html
あと気になったところとして、
> char line[MAX_LINES][LINE_SIZE];
グローバル変数にする必要がないので、main関数内で宣言した方がよい。
> fscan(fp,"%d",&line);
・fscanになっている。
・%dなのに&lineが整数型でない。(&lineはchar *型)
・仮に%sの間違いの場合、
&lineは間違いではないけど、意味的にline[0]にした方が分かりやすそう。
(後ろでline[0]で使ってますし。)
> fscanf(fp,"%s",&line[i]);//ファイルから文字列を変数に入力
・lineがchar **型でもchar[MAX_LINES][LINE_SIZE]型でも
&line[i]の型はchar型になる。
ここに要求されるのはchar *型なのでline[i]とするべき。
> num=line[0];//単語数を戻り値とする
・戻り値と書いてあるのにreturnで返していない。(コメントが嘘)
ここはグローバル変数numを作らなくてもコメント通りreturnで返せばよいと思いますよ。
そうすればnumをグローバル変数にする必要もなくなります。
・int型のnumにchar *型のline[0]を代入するのは変。(ポインタが代入されるけどそれでいいの?)
> read_words(argv[1],line,int num);
・int numはおかしい(intはいらない)。
> また、僕は何がわかってないですか?
あえて言えば、ポインタ・配列が絡んだ"型"がよく分かっていないなという感じがしました。
No.6
- 回答日時:
#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
#define LINE_SIZE 20
#define MAX_LINES 10
void
read_words(char *fname, char line[][LINE_SIZE], int *num)
{
FILE *fp;
int i;
if ((fp = fopen(fname, "r")) == NULL) {
printf("ファイル%sを開けません\n", fname);
exit(errno);
}
for (i = 0; i < MAX_LINES; i++) {
if (fgets(line[i], LINE_SIZE, fp) == 0) {
break;
}
line[i][strlen(line[i]) - 1] = 0;
}
fclose(fp);
*num = i;
}
void
display_words(char line[][LINE_SIZE], int num)
{
int i;
for (i = 0; i < num; i++) {
printf("%d: %s\n", i + 1, line[i]);
}
}
int
strsort(const void *p, const void *q)
{
return (strcmp(p, q));
}
void
sortword(char line[][LINE_SIZE], int num)
{
qsort(line, num, LINE_SIZE, strsort);
}
int
main(int argc, char *argv[])
{
char line[MAX_LINES][LINE_SIZE];
int num;
read_words(argv[1], line, &num);
sortword(line, num);
display_words(line, num);
return 0;
}
No.5
- 回答日時:
もうだいぶはなれてしまったので気の付いた点だけ。
for(i=0;i<MAX_LINES;i++)//
でカウントアップしてるのに
i++;//繰り返し変数の増加
とは?
No.4
- 回答日時:
すみません。
一部不正確なところがありました。>> fscan(fp,"%d",&line);
>・%dなのに&lineが整数型でない。(&lineはchar *型)
%dの時は続く引数はint型へのポインタ(int*)である必要があるので間違いです。
(整数型である必要があるというのは間違いです。)
No.2
- 回答日時:
とりあえず、気の付いた点
char **line で受けた場合、一行の大きさはどのようにしてわかるのでしょうか?
この時 line[i] は、何を指していますか
>fscan(fp,"%d",&line);
は、何を取り込もうとしているのでしょうか?
No.1
- 回答日時:
char line[MAX_LINES][LINE_SIZE]
と char** とが異なる型だからです.
int read_words(char *fname,char **line,int num)
を
int read_words(char *fname,charline[MAX_LINES][LINE_SIZE],int num)
に変えればとりあえずエラーはなくなると思いますよ.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
昨日見た夢を教えて下さい
たまにすごいドラマチックな夢見ること、ありませんか? 起きてからも妙に記憶に残っているような、そんな夢。
-
「お昼の放送」の思い出
小学校から中学校、ところによっては高校まで お昼休みに校内放送で、放送委員が音楽とかおしゃべりとか流してましたよね。 最近は自分でもラジオができるようになって、そのクオリティもすごいことになっていると聞きます。
-
構文エラー;"が型の前にありませんとは、どうしたら解決できるのですか。"
C言語・C++・C#
-
間接操作のレベルとは
C言語・C++・C#
-
HEWを使用しているのですが、このようなエラーが出ました。
C言語・C++・C#
-
-
4
関数から配列を返すには?
C言語・C++・C#
-
5
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
6
fopenで別ディレクトリにファイルをオープンしたい
C言語・C++・C#
-
7
C言語---ファイルに出力したデータをすべて消去する方法
C言語・C++・C#
-
8
scanfが2回使えない・・・?;
C言語・C++・C#
-
9
PROCのコンパイルエラーの取り方がわかりません
C言語・C++・C#
-
10
左側がクラス、構造体、共用体、ジェネリック型への
C言語・C++・C#
-
11
バッファとは何ですか
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c++ 文字列を入力して、一文字...
-
文字列から空白を取り除きたい...
-
-'0'の意味について
-
C言語のfor文です。 繰り返しの...
-
下記のプログラムがコンパイラ...
-
C言語プログラミングについて(...
-
fgetsなどのときのstdinのバッ...
-
Win32APIでのエディットボック...
-
double型の値をchar配列に変換...
-
C++(というよりC)で文字を置換
-
半角カナ→16進
-
全角文字を含んだ文字の並びを...
-
TCHAR文字列?の特定部分の数字...
-
DxLibについて質問です
-
絶対パスからのファイル名の切...
-
MFCでのBITMAP作成について
-
C言語エラーについて
-
構造体の各メンバにfor文からア...
-
charからLPTSTRへの変換方法
-
配列をnビットシフトする
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringをwchar_tに変換したい
-
fgetsなどのときのstdinのバッ...
-
charからLPTSTRへの変換方法
-
C言語のfor文です。 繰り返しの...
-
文字列から空白を取り除きたい...
-
配列をnビットシフトする
-
間接操作のレベルとは
-
charでの計算?
-
テキストデータをそのままバイ...
-
型変換
-
'const char *' 型は 'char *' ...
-
double型の値をchar配列に変換...
-
間接参照のレベルが異なっています
-
干支のプログラム
-
atoi( ) の反対をやりたい
-
C言語です
-
絶対パスからのファイル名の切...
-
ネットワークにつながっている...
-
【C言語】文字型と整数型の違い
-
Win32APIでのエディットボック...
おすすめ情報