単語を昇順でソートするプログラミングでエラーが出て困っている者です。
エラーが出てる箇所のみ抜粋して、あとは省略したものが下記です。
下記の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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
構文エラー;"が型の前にありませんとは、どうしたら解決できるのですか。"
C言語・C++・C#
-
間接操作のレベルとは
C言語・C++・C#
-
HEWを使用しているのですが、このようなエラーが出ました。
C言語・C++・C#
-
-
4
コンパイルできません。
C言語・C++・C#
-
5
構造体から平均点を求める方法
C言語・C++・C#
-
6
str系関数を使わずに二つの文字を結合する方法
C言語・C++・C#
-
7
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
8
C言語の入力した文字を反転させるプログラミングの仕方が分かりません。
Ruby
-
9
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
10
Run-Time Check Failure #3というエラーが出ます。
C言語・C++・C#
-
11
EOF
C言語・C++・C#
-
12
'const char *' 型は 'char *' 型に変換できない ??
C言語・C++・C#
-
13
fopne で失敗する原因
C言語・C++・C#
-
14
error C2143: 構文エラー : ';' が '{' の前にありません。
C言語・C++・C#
-
15
while文について、c言語です。
C言語・C++・C#
-
16
c言語 構造体
C言語・C++・C#
-
17
fscanf関数について
C言語・C++・C#
-
18
対応する関数ヘッダーがありません
C言語・C++・C#
-
19
strcat関数を自作したいです
C言語・C++・C#
-
20
#include <Windows.h>というヘッダファイルについて
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の入力した文字を反転させ...
-
配列をnビットシフトする
-
charからLPTSTRへの変換方法
-
C言語エラーについて
-
c言語
-
カラー画像からグレースケール...
-
'const char *' 型は 'char *' ...
-
C言語です
-
char* を渡したとき、不適切なP...
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語、リダイレクト
-
ひとつのプログラムにしたいの...
-
ビット演算について
-
【至急】C言語の問題です、どな...
-
文字列がNULLか空文字列かの判定
-
object型からchar型へ変換の方法
-
文字列から空白を取り除きたい...
-
C言語のsendとrecv
-
int型からchar型への変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
型変換
-
テキストデータをそのままバイ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
絶対パスからのファイル名の切...
-
fgetsなどのときのstdinのバッ...
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
3桁区切(コンマ)記号をつけ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語のfor文です。 繰り返しの...
-
switch文で文字を比較すること...
-
ファイル名である文字列からbas...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
おすすめ情報