こんにちは、
皆様のお知恵をお借りしたく投稿させていただきました。
「動的計画法」を用い(C言語)diffコマンドを実装したいというのが今回の質問の内容です。
二つのテキストa,bがあるとします。
[atxt]
aaaaaaaaaaaaaaa
aaaaaaaaaaaaaab
aaaaaaaaaaaaaac
aaaaaaaaaaaaaad
11111
22222
33333
44444
[b.txt]
aaaaaaaaaaaaaaa
aaaaaaaaaaaaabb
aaaaaaaaaaaaacc
aaaaaaaaaaaaaad
eeeeeeeeeeeeeee
11111
44444
この二つのテキストを見比べると・・・
どちらも2行3行目が違う(2,3c2,3)
aは5行目にeee・・・がない(4a5)
bは22222,33333がない(6,7d6)
[出力結果]
2,3c2,3
<aaaaaaaaaaaaaab
<aaaaaaaaaaaaaac
---
>aaaaaaaaaaaaabb
>aaaaaaaaaaaaacc
4a5
>eeeeeeeeeeeeeee
7,8d5
<22222
<33333
↑というように出力されるようにdiffコマンドを実装したいです。
ーー=Cプログラムーーー
#include <stdio.h>
struct text_info
{
char* content;
int length;
struct text_info* next;
};
int read_file( const char* filename, struct text_info** info )
{
FILE* fp;
struct text_info *current_info;
struct text_info *next_info;
ssize_t line_size;
char* buff = NULL;
size_t buf_size = 0;
int count = 0;
fp = fopen( filename, "ra" );
if( fp == NULL )
{
perror(filename);
exit(-1);
}
*info = (struct text_info*)malloc(sizeof(struct text_info));
current_info = *info;
current_info->content = NULL;
current_info->length = 0;
current_info->next = NULL;
while( (line_size = getline(&buff,&buf_size,fp)) != -1 )
{
current_info->content = (char*)malloc(sizeof(char)*(line_size+1));
strcpy(current_info->content,buff);
current_info->length = line_size;
next_info = (struct text_info*)malloc(sizeof(struct text_info));
next_info->content = NULL;
next_info->length = 0;
next_info->next = NULL;
current_info->next = next_info;
current_info = next_info;
count++;
}
if( buff )
free(buff);
fclose(fp);
return count;
}
void conv_text_info_to_string_array( const struct text_info* info,
int linenum,
char*** array )
{
int count = 0;
*array = (char**)malloc(sizeof(char*)*linenum);
while( count < linenum && info != NULL )
{
// printf("%d\n",count);
(*array)[linenum-count-1] = info->content;
info = info->next;
count++;
}
}
/* ↓以下の関数を完成させたい */
void dp( char** array_input, int in_linenum,
char** array_ref, int ref_linenum )
{
int i,j;
printf("*** 入力ファイル ***\n");
for( i = 0; i < in_linenum; i++ )
printf("%s",array_input[i]);
printf("*** 参照ファイル ***\n");
for( j = 0; j < ref_linenum; j++ )
printf("%s",array_ref[j]);
}
int main(int argc, char* argv[])
{
struct text_info *in_info, *ref_info;
int in_linenum, ref_linenum;
char **in_array, **ref_array;
if( argc < 3 )
{
printf("%s input.txt refer.txt\n",argv[0]);
return -1;
}
printf("read input file\n");
in_linenum = read_file( argv[1], &in_info );
printf("%d lines read.\n",in_linenum);
conv_text_info_to_string_array( in_info, in_linenum, &in_array );
printf("read reference file\n");
ref_linenum = read_file( argv[2], &ref_info );
printf("%d lines read.\n",ref_linenum);
conv_text_info_to_string_array( ref_info, ref_linenum, &ref_array );
dp( in_array, in_linenum, ref_array, ref_linenum );
}
ーーーーーーーーーーーーーーーーーーーーーーーーーー
dp関数をどうしていいか分からず悩んでいます。
皆様のお力をお貸しください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
charでの計算?
-
CStringをwchar_tに変換したい
-
間接参照のレベルが異なっています
-
RGB→YUV変換のプログラム
-
バイナリファイルをコピーする...
-
ワイルドカードを用いた文字列検索
-
C言語 ミリ秒を日付に変換には
-
double型の値をchar配列に変換...
-
C言語のポインターで詰まっている
-
c言語配列の結合についてです。...
-
文字列から空白を取り除きたい...
-
ftoa の作り方
-
引数の渡し方と受け方(argv)
-
型変換
-
文字列がNULLか空文字列かの判定
-
int main()の・・・
-
'const char *' 型は 'char *' ...
-
C言語プログラミングについて(...
-
Win32APIでのエディットボック...
-
strtok関数 自作
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringをwchar_tに変換したい
-
fgetsなどのときのstdinのバッ...
-
charからLPTSTRへの変換方法
-
C言語のfor文です。 繰り返しの...
-
文字列から空白を取り除きたい...
-
配列をnビットシフトする
-
間接操作のレベルとは
-
charでの計算?
-
テキストデータをそのままバイ...
-
型変換
-
'const char *' 型は 'char *' ...
-
double型の値をchar配列に変換...
-
間接参照のレベルが異なっています
-
干支のプログラム
-
atoi( ) の反対をやりたい
-
C言語です
-
絶対パスからのファイル名の切...
-
ネットワークにつながっている...
-
【C言語】文字型と整数型の違い
-
Win32APIでのエディットボック...
おすすめ情報