• 締切済み

c言語 DFAのプログラム

DFAを受理するプログラムを組んでいるのですが、コンパイルして動作させるとすぐに終わってしまいます。 どこがいけないのでしょうか…。助言を求めています。 手探りでやっているのですが、ファイル読み込みなど、基本的な所からわかっていない状態です。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <getopt.h> enum { NFA_0_2_3_5, NFA_0_1_2_3_5_6_7_8_10_11_12, NFA_4_7_8_10, NFA_11_12, NFA_9_12, NFA_13_15_16, NFA_14 }; int regex(char *txt, int idx); int DFA_match(char *txt, int startIndex); int main (int argc, char *argv[]) { int c, i, m, idx; char text[1024], *pattern; FILE *fp; pattern = argv[optind++]; for (i = optind; i < argc; i++) { fp = fopen(argv[i], "r"); if (fp == NULL) { fprintf(stderr, "File %s: open failed.\n", argv[i]); } else { while (fgets(text, sizeof(text), fp) != NULL) { m = 0; for (idx = 0; (idx = regex(text, idx)) >= 0; idx++) { m++; } if (m > 0) { printf("%s: %s", argv[i], text); } } } } return 0; } int DFA_match(char *txt, int startIndex) { int DFAstate = NFA_0_2_3_5; int acceptLen = -1; int i; for (i = startIndex; txt[i] != '\0'; i++) { switch (DFAstate) { case NFA_0_2_3_5: switch(txt[i]){ case 'x': DFAstate = NFA_0_1_2_3_5_6_7_8_10_11_12; break; case 'z': DFAstate = NFA_4_7_8_10; break; default: return acceptLen; } break; case NFA_0_1_2_3_5_6_7_8_10_11_12: switch(txt[i]){ case 'x': DFAstate = NFA_0_1_2_3_5_6_7_8_10_11_12; break; case 'z': DFAstate = NFA_4_7_8_10; break; case 'y': DFAstate = NFA_9_12; break; default: return acceptLen; } break; case NFA_4_7_8_10: switch(txt[i]){ case 'x': DFAstate = NFA_11_12; break; case 'y': DFAstate = NFA_9_12; break; default: return acceptLen; } break; case NFA_11_12: switch(txt[i]){ case 'y': DFAstate = NFA_9_12; break; default: return acceptLen; } break; case NFA_9_12: switch(txt[i]){ case 'y': DFAstate = NFA_13_15_16; acceptLen = i; break; default: return acceptLen; } break; case NFA_13_15_16: switch(txt[i]){ case 'x': DFAstate = NFA_14; break; default: return acceptLen; } break; case NFA_14: switch(txt[i]){ case 'y': DFAstate = NFA_13_15_16; acceptLen = i; break; default: return acceptLen; } break; } } return acceptLen; } int regex(char *txt, int idx) { int i; for (; idx < strlen(txt); idx++) { if ( (i = DFA_match(txt, idx)) > 0) { printf("matched!\n"); return idx; } } return -1; }

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

コマンドライン引数がわかってないのかもしれませんね cygwinで $ a bbb ccc.txt とするとa.exeが実行され入力した文字列が引数として渡されます プログラムで引数をうけとるのが argcとargv[ ] です argcには引数の数(a, bbb, ccc.txtの3つがあるので3) argv[ ] にはそれぞれの文字列 argv[0]は"a" argv[1]は"bbb" argv[2]は"ccc.txt" が入ります。 (それとオプション引数を使っている様子はないので<getopt.h>とoptindは要らないのでは。)

saku0513
質問者

お礼

回答ありがとうございました。 おっしゃる通り、コマンドライン引数が分かっていない状態で他の文字探索のプログラムを流用して組んだのがmain関数だったので、不要な部分が多くありました。 上の回答を参考にいらない部分を削り、main関数の見直しをしてみたら動作するようになりました。また、今までコマンドライン引数を少し避けてしまっていたのですが、学習するよい機会になりました。 とてもわかりやすい説明をありがとうございました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

>mainで入力すら行えず困っています。 マッチングそのものが正しく動くかどうかは別として、 このプログラムを sample という名前とすると 一行にひとつの対象となる文字列が置かれているようなファイルがあって sample 適当な文字列 ファイル名1 ファイル名2 とすればプログラム中のDFAを使ってマッチングを試みています。 forも実行していないというのはそういうことではないのですか? とりあえずは、デバッガーでステップ実行すれば状況が把握できるとお思いますけど。

saku0513
質問者

お礼

回答ありがとうございました。 おかげさまでなんとか動作するようになりました。 ファイルの読み込み周辺がまだしっかり理解できていない状態で、他のプログラムを流用してきたのが原因でした。お恥ずかしい限りです。 大変参考になるご意見をありがとうございました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

「DFAを受理する」という言い回しが良くわからない(何かの入力を受理するDFAならわかりますが)のですが、 どこかからもらってきたものですか? 関数 main の先頭付近を見ると pattern = argv[optind++]; for (i = optind; i < argc; i++) { fp = fopen(argv[i], "r"); grep のように、プログラムの第一引数にパターン、二番目以降に検索対象のファイルということのようですが、 この pattern は代入されて以降一回も使われていません。 おそらく、本来はこれが正規表現にでもなっていて、そこから DFAを組み立ててマッチングを行うもののような気がします。 DFA_match は追いかけたくありませんが、受け付けるアルファベットが x, y, z である文法ということなんでしょうか。

saku0513
質問者

補足

言葉が足りておらず申し訳ありません。 あらかじめ指定された正規表現(x,y,zで構成される)のパターンがあり、それを受理するDFAから作ったのが関数DFA_matchです。従って受け付けるアルファベットはx,y,zになります。 mainからregexに引数txt(検索対象の文字列)と引数idx(検索開始位置)を渡してマッチングを行いたいのですが、mainで入力すら行えず困っています。 mainは他の文字探索プログラムから適当に流用したものなので、現段階では全く見当違いの内容かもしれません。 ご指摘ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

main で for ループに入っているかどうか, あるいは while でちゃんと読めているかは確認しましたか? 例えば for の直後 (fopen の前) に printf("argv[%d] = %s\n", i, argv[i]); fflush(stdout); while の直後 (m = 0 の前) に printf("text = %s\n", text); を入れて動かしてみてください.

saku0513
質問者

お礼

forループに入ってもいないみたいですね…。 確認もしていませんでした。教えて下さりありがとうございます。 今からもう一度見なおしてテキストの入力方法を調べてみます。 ありがとうございました。 引き続き回答募集しています。 助言などしていただけたら嬉しいです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

はっきりいって長いので読む気なし. あなたがどのような動作を期待しているのかわからないので, ・どのような動作を期待しているのか ・どのように実行したのか ・どのようなデータを与えたのか ・どのような結果が得られたのか をきちんと書いてください.

saku0513
質問者

補足

ご指摘ありがとうございます。焦ったあまりに言葉が足りていませんでした。ごめんなさい。 このプログラムでは、テキストファイルを読み込み・またはテキストを入力して、それをあらかじめ指定されたパターンとマッチさせ、一致していた場合は"matched"と表示させたいと思っています。 関数DFA_matchはそのパターンから作ったDFAに応じてマッチングをする関数です。mainからregexには引数txt(検索対象の文字列)と引数idx(検索開始位置)を渡します。 cygwinでテキスト入力→ctrl+Dでパターンマッチを行うようにしたいのですが、コンパイルはうまく(?)いくのですが動作させると何も入力しないままに終わってしまいます。 以上で大丈夫でしょうか…? 自分ではmainのテキスト入力のあたりがおかしなことになっているのだと思います。しかしどこがまずいのか見直してもわかりません。 引き続きアドバイスを募集しています。

関連するQ&A

  • C言語 カウント ファイル出力

    C言語 ファイル入出力 文字カウント C言語の勉強をしています。 ファイル入出力+文字カウントがわからなく質問させてもらいました。 問題の内容は文字EADBACABEEAACが入っているファイルmon1.txtを読み込み 何回文字が登場するのかをカウントするというものです。 カウント結果はコマンドプロンプトとmon1.txtに出力します。 自分でかけるところまで書いてみたのですが※の部分がどうやれば良いのかわからず質問させていただきました。 ご教授よろしくお願いします。 #include <stdio.h> #include <ctype.h> int main() { FILE *fp; char ch; int i; int a; int b; int c; int d; int e; fp = fopen("mon1.txt", "w"); if(fp == NULL) { printf("出力ファイルオープンエラー\n"); return -1; } for(i = 0; ※ == '\0'; i++) { switch (※) { case 'A': a++; break; case 'B': b++; break; case 'C': c++; break; case 'D': d++; break; case 'E': e++; break; default: break; printf("A[%d]回、B[%d]回、C[%d]回、D[%d]回、E[%d]回",a,b,c,d,e); fprintf(fp, "A[%d]回、B[%d]回、C[%d]回、D[%d]回、E[%d]回",a,b,c,d,e); } } return 0; }

  • この(C言語)ダブルポインタのアルゴリズムを教えて!

    main(int argc, char *argv[]) while(--argc > 0) { if(**(++agv) == '-') { switch(argv[0][1]){ case 'a'; オプションaに対する処理; break; case 'b'; オプションbに対する処理; break; case 'c'; オプションcに対する処理; break; default;; abc 以外のオプションが入力された時の処理; } } else break; } オプション以外のパラメータが入力されたときの処理; 特に ’**’の部分や argv[0][1]の意味が解かりません。 よろしくお願い致します。

  • コンパイルするとエラーに。C言語

    OSはLINUXです。GNOME 端末を使用してます。ここの関数でエラーが起きているみたいなんです。(部分的に載せてしまいましたが、それとも全体も載せた方がいいでしょうか?) void readargs(int argc, char *argv[]) { int c; int atoi(char *); while (--argc > 0 && (c = (*++argv)[0] == '-' || c == '+') { if (c == '-' && !isdigit(*(argv[0]+1))) while (c = *++argv[0]) switch (c) { case 'd': option |= DIR; break; case 'f': option |= FOLD; break; case 'n': option |= NUMERIC; break; case 'r': option |= DECR; break; default: printf("sort: illegal option %c\n", c); error("Usage: sort -dfnr [+pos1] [-pos2]"); break; } else if (c == '-') pos2 = atoi(argv[0]+1); else if ((pos1 = atoi(argv[0]+1)) < 0) error("Usage: sort -dfnr [+pos1] [-pos2]"); } if (argc || pos1 > pos2) error("Usage: sort -dfnr [+pos1] [-pos2]"); } } ちなみに、エラー内容は「case label not within a switch statement」 「break statement not within loop or switch」です。 似たような問題はできたのですが、これだけはなぜかエラーが起きてしまいました。アドバイス・回答待ってます。

  • C言語 switch文について

    C言語初心者です。 以下のようにC言語でプログラムを書いてみたのですが、 一つの入力に対して、対応するcase文に加えてdefault部の内容も表示されてしまいます。 (aを入力すると day before yesterday と day after tomorrowが表示されるような感じです) i,j,k などを使ってどう実行されているかを調べると、どうやら一回の入力に対して二回switch部を回っているようです。 そうにしろなぜaに対してdefaultへ飛ぶのか理解できませんが・・ また、最初の宣言をchar から int にして(caseは、case 1とかに適当に変えて)やると、正常に動くのも不可解です。 どうなっているんでしょうか・・ どなたかご教授願えると幸いです。よろしくお願いいたします。 #include <stdio.h> int main(void) { char n; int i=0,j=0,k=0; k++; while(scanf("%c",&n),n!='E'){ i++; switch(n){ case 'a': puts("day before yesterday"); break; case 'b': puts("yesterday"); break; case 'c': puts("today"); break; case 'd': puts("tomorrow"); break; default: puts("day after tomorrow"); break; j++; } } printf("%d\n",i); printf("%d\n",j); printf("%d\n",k); return 0; }

  • C言語エラー

    C言語をいじっているのですが、16行目と19行目の「型」の前に「;」がありませんと表示されます。 どこをどう改善すればいいか教えてもらえないでしょうか /*遊び半分*/ #include <stdio.h> #include <process.h> int main() { char dear; printf("ああああ\n"); printf("ああああ \n"); scanf_s("%c", &dear); switch (dear){ case 'A04': ; int main(void); { printf("ああああ\n"); int main(void); printf("あああ\n"); printf("あああ\n"); break; system("pause"); return 0; } case 'C34' : printf("\n"); break; case 'E24' : printf("\n"); break; case 'F38' : printf("\n"); break; default: printf("メッセージはありません\n"); break;} return 0;

  • C言語の引数について

    「戻り値、値渡し、ポインタ渡しを用いたサブ関数を実装する」 という課題に対して、calc_proc関数を実装したのですが、下記のコード提出後に 「引数で値をmainに戻すパターンを実装する」 との要望を受けたのですが、やり方が分からず、どなたか修正方法、追加方法を教えて頂けないでしょうか? 「ソースコード」 #include <stdio.h> #include <time.h> #include <string.h> #include <stdlib.h> #define CALC (3) #define FROM_YEAR (1900) #define MAX_LINE (1000) #define MAX_ROW (1000) float calc_proc(int* n1, char op, int n2) { switch (op) { case '+': (float)*n1 + n2; break; case '-': (float)*n1 - n2; break; case '*': (float)*n1 * n2; break; case '/': if (n2 == 0) { puts("input error"); return 1; } (float)(float)*n1 / n2; break; default: printf("input error"); } return 0; } int cmp_u(const void* a, const void* d) { return strcmp((char*)a, (char*)d); } int cmp_d(const void* a, const void* d) { return strcmp((char*)d, (char*)a); } int main() { int num1, num2; char op; float answer; int r,i; FILE* fp; char e[11]; char sin[MAX_LINE][MAX_ROW]; char ad[8]; fp = fopen("log.txt", "a+"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } while (1) { r = scanf("%d%c%d", &num1,&op, &num2); if (r != CALC) { puts("input error"); return 1; } answer = calc_proc(&num1, op, num2); time_t t = time(NULL); struct tm* tm = localtime(&t); printf("%d/%02d/%02d ", tm->tm_year + FROM_YEAR, tm->tm_mon + 1, tm->tm_mday); printf("%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); printf("%d%c%d,%f\n", num1, op, num2, answer); fprintf(fp, "%d/%02d/%02d ", tm->tm_year + FROM_YEAR, tm->tm_mon + 1, tm->tm_mday); fprintf(fp, "%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); fprintf(fp, "%d%c%d,%f\n", num1, op, num2, answer); printf("計算を続けますか?"); scanf("%s", e); if (strcmp(e, "no") == 0) { break ; } } fclose(fp); fp = fopen("log.txt", "r"); int cnt = 0; for (i = 0;i < MAX_LINE;i = i + 1) { if (fgets(sin[i], sizeof(sin[0]), fp)) ++cnt; else break; } fclose(fp); printf("ASC or DESC: "); scanf("%s", ad); if (strcmp(ad, "ASC") == 0) { qsort(sin, cnt, sizeof(sin[0]), cmp_u); } else { qsort(sin, cnt, sizeof(sin[0]), cmp_d); } for (i = 0;i < cnt;i = i + 1) { printf("%s", sin[i]); } return 0; }

  • C言語・Windows 文字の出力ができない

    C言語でWindowsプログラミングをしているのですが、文字がうまく扱えなくて困っています。 txtファイルから読み込んだ文字を"@@"のところで区切って、ウィンドウに描画するだけなのですが、うまくできません。 例) contents.txtファイル(以下中身です。) データ整理@@ファイル、フォルダをインポート@@アドレスからインポート@@txtとpdf(html,jpg,bmp)を等価に扱う@@検索@@タグ これをウィンドウに  データ整理  ファイル、フォルダをインポート  アドレスからインポート  txtとpdf(html,jpg,bmp)を等価に扱う  検索  タグ というように表示したいのですが、なぜか  データ整理  ファイル、フォルダをインポートアドレスからインポート  アドレスからインポート  txtとpdf(html,jpg,bmp)を等価に検索  検索  タグ のように表示されてしまいます。 (二段目と四段目がおかしくなっています、書き間違えではないです、念のため) 初心者なので、勉強不足による些細な間違いかもしれませんが、なにとぞ知恵をお貸しくださいm(_ _)m 以下、ソースコードのメッセージ処理部分です。 ウィンドウ生成のひな型は問題ないと判断しました。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static int i = 0, j = 0, k = 0; int fp; HDC hdc; PAINTSTRUCT ps; char script[1000]; static char title[100][30]; switch (msg){ //ウィンドウ生成時 case WM_CREATE: fp = Reading("./contents.txt", script); if(fp == -1){ MessageBox(hWnd, (LPCSTR)"contents.txtが存在しない", (LPCSTR)"ERROR", MB_OK | MB_ICONEXCLAMATION); }else{ for(;;){ if(script[i] == '\0'){ title[j][k] = '\0'; break; }else if(script[i] == '@' && script[i+1] == '@'){ title[j][k] = '\0'; i += 2; j++; k = 0; }else{ title[j][k] = script[i]; i++; k++; } } for(i = 0; i <= j; i++){ } } break; //ウィンドウの描画 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); SetBkMode(hdc, TRANSPARENT); for(i = 0; i <= j; i++){ TextOut(hdc, 0, MOJI_SIZE * i, (LPSTR)title[i], strlen(title[i])); } EndPaint(hWnd, &ps); break; //ウィンドウの削除 case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); } //読み込み int Reading(const char* filename, char* script) { int pos = 0; char c; //スクリプトファイル FILE* fp; //スクリプトファイルを開く fp = fopen(filename, "r"); if( fp == NULL ) { //ファイル読み込みに失敗 return -1; } for( ;; ) { //一文字読み込み c = fgetc( fp ); //ファイルの終わりかどうか if( feof( fp ) ) { script[pos] = '\0'; break; } //改行文字が出てきた場合,無視 if( c != '\n' && c != '\t' ) { //書き込み script[pos] = c; //文字書き込み位置をずらす pos++; } } fclose(fp); return 0; }

  • C言語 シンプルソート

    C言語始めて1年の初心者です。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 10000 void swapData(char *x, char *y); void simpleSort(char data[], int first, int last); int main(int argc, char *argv[]) { int data[MAXSIZE][300]; int i, j, count; FILE *fp; if(argc != 2) { fprintf(stderr, "Usage: %s <filename>\n", argv[0]); exit(0); } if ((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "File %s is not found.\n", argv[1]); exit(0); } for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i]) == EOF) break; } simpleSort(data[], 0, i - 1); for(j = 0; j < i; j++) printf("%s\n", data[j]); } void swapData(char *x, char *y){ char tmp[300]; strcpy(tmp, x); strcpy(x, y); strcpy(y, tmp); } void simpleSort(char data[], int first, int last) { int i, j; for(i = first; i < last; i++){ for(j = i+1; j <= last; j++){ if(strcmp(&data[i], &data[j]) > 0) swapData(&data[i], &data[j]); } } } 読み込んだ文字データをシンプルソートするプログラムなんですが、コンパイルできません。 simpleSortの部分がおかしいみたいなんですが、見直しても先入観からか間違いを見つけられません・・・・ どなたか間違いを指摘していただけたら助かります。

  • コンパイルするとエラーに。C言語(改め)

    インクルード 定義 メイン関数 エラー内容 が収まりませんでした; (長すぎてどうすればよいのやら;) int readlines(char *lineptr[], int maxlines) { int len, nlines; char *p, line[MAXLEN]; nlines = 0; while ((len = getline(line, MAXLEN)) > 0) if (nlines >= maxlines || (p = alloc(len)) == NULL) return -1; else { line[len-1] = '\0'; strcpy(p, line); lineptr[nlines++] = p; } return nlines; } char *alloc(int n) { if (allocbuf + ALLOCSIZE - allocp >= n) { allocp += n; return allocp - n; } else return 0; } void kr_qsort(char *v[], int left, int right, int (*comp)(void *, void *)) { int i, last; void swap(char *v[], int i, int j); if (left >= right) return; swap(v, left, (left + right)/2); last = left; for (i = left+1; i <= right; i++) if ((*comp)(v[i], v[left]) < 0) swap(v, ++last, i); swap(v, left, last); kr_qsort(v, left, last-1, comp); kr_qsort(v, last+1, right, comp); } void swap(char *v[], int i, int j) { char *temp; temp = v[i]; v[i] = v[j]; v[j] = temp; } void readargs(int argc, char *argv[]) { char c; int atoi(char *); while (--argc > 0 && (c = (*++argv)[0] == '-' || c == '+') { if (c == '-' && !isdigit(*(argv[0]+1))) while (c = *++argv[0]) switch (c) { case 'd': option |= DIR; break; case 'f': option |= FOLD; break; case 'n': option |= NUMERIC; break; case 'r': option |= DECR; break; default: printf("sort: illegal option %c\n", c); error("Usage: sort -dfnr [+pos1] [-pos2]"); break; } else if (c == '-') pos2 = atoi(argv[0]+1); else if ((pos1 = atoi(argv[0]+1)) < 0) error("Usage: sort -dfnr [+pos1] [-pos2]"); } if (argc || pos1 > pos2) error("Usage: sort -dfnr [+pos1] [-pos2]"); } } void writelines(char *lineptr[], int nlines, int order) { int i; if (order) for (i = nlines-1; i >= 0; i--) printf("%s\n", lineptr[i]); else for (i = 0; i < nlines; i++) printf("%s\n", lineptr[i]); } int charcmp(char *s, char *t) { char a, b; int i, j, endpos; int option, pos1, pos2; int fold = (option & FOLD) ? 1 : 0; int dir = (option & DIR) ? 1 : 0; i = j = pos1; if (pos2 > 0) endpos = pos2; else if ((endpos = strlen(s)) > strlen(t)) endpos = strlen(t); do { if (dir) { while (i < endpos && !isalnum(s[i]) && s[i] != ' ' && s[i] != '\0') i++; while (j < endpos && !isalnum(t[j]) && t[j] != ' ' && t[j] != '\0') j++; } if (i < endpos && j < endpos) { a = fold ? tolower(s[i]) : s[i]; i++; b = fold ? tolower(t[j]) : t[j]; j++; if (a == b && a == '\0') return 0; } } while (a == b && i < endpos && j < endpos); return a - b; } int numcmp(char *s1, char *s2) { double v1, v2; char str[MAXSTR]; substr(s1, str, MAXSTR); v1 = atof(str); substr(s2, str, MAXSTR); v2 = atof(str); if (v1 < v2) return -1; else if (v1 > v2) return 1; else return 0; } void substr(char *s, char *str, int maxstr) { int i, j, len; extern int pos1, pos2; len = strlen(s); if (pos2 > 0 && len > pos2) len = pos2; else if (pos2 > 0 && len > pos2) error("substr: string too short"); for (j = 0, i = pos1; i < len; i++, j++) str[j] = s[i]; str[j] = '\0'; } int getline (char s[], int lim) { int c, i; i = 0; while (--lim > 0 && (c=getchar()) != EOF && c != '\n') s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return i; } void error(char *s) { printf("%s\n", s); exit(1); }

  • C言語のソートについて

    C言語で下記のファイルの中身を昇順と降順で出力しようとしているのですが、ソートが上手くいっていない状況です。 どなたか修正点を教えて頂けないでしょうか? 「ファイルの中身」 2022/11/14 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 2022/11/15 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/18 16:20:18 8+8,16.000000 2022/11/17 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 「ソースコード」 #include <stdio.h> #include <string.h> #include <stdlib.h> int cmp_u(const void* a, const void* d) { return *(char*)a - *(char*)d; } int cmp_d(const void* a, const void* d) { return *(char*)d - *(char*)a; } int main() { int r,i,n; FILE* fp; char sin[9][1000]; fp = fopen("log.txt", "r"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } for (i = 0; i < 9; i++) { fscanf(fp, "%s", &(sin[i])); } fclose(fp); printf("ASC or DESC: "); scanf(" %s", &ad); if (strcmp(ad, "ASC") == 0) { qsort(sin, 9, sizeof(char), cmp_u); } else { qsort(sin, 9, sizeof(char), cmp_d); } for (i = 0; i < 9; i++) { printf("%s\n", sin[i]); } return 0; }

専門家に質問してみよう