Tcl言語で漢数字変換を含んだ計算処理について

このQ&Aのポイント
  • Tcl言語で漢数字変換を含んだ計算処理についての質問です。質問文章から、センセーショナルなタイトルと文章の要約を作成してください。
  • 質問内容は、Tcl言語を使用して漢数字変換を含んだ計算処理を行いたいというものです。具体的には、「二百五+十=」という式を読み込み、結果を書き込みファイルに「二百十五」と出力したいという要望です。
  • 現在のコードでは、十、百、千、万を含んだ漢数字を数字に変換しようとしていますがうまくいかず、困っています。具体的な実装方法や基本的な事項についての質問です。ご教授いただけますか?
回答を見る
  • ベストアンサー

Tcl言語で漢数字変換を含んだ計算処理について

長文失礼します。 二百五+十= を読み込み、書き込みファイルへ 二百五+十=二百十五 と出力することが今回実行したいことです。 下記ソースで、 例)三四+一五二=一八六 といった計算処理までは行えています(エラー処理は未実装)。 追記したいのは、十、百、千、万を含んだ漢数字を数字変換する処理です。 二百→2*100 五→5 →205といった処理の実装がうまくいかず困っています。 基本的な事項についての質問ですが、ご教授いただけないでしょうか。 よろしくお願いします。 #漢字から数字へ変換 proc kanNum {s_stVal} { set i_stval "" if {$s_stVal == "一"} { set i_stval "1" } if {$s_stVal == "二"} { set i_stval "2" } if {$s_stVal == "三"} { set i_stval "3" } if {$s_stVal == "四"} { set i_stval "4" } if {$s_stVal == "五"} { set i_stval "5" } if {$s_stVal == "六"} { set i_stval "6" } if {$s_stVal == "七"} { set i_stval "7" } if {$s_stVal == "八"} { set i_stval "8" } if {$s_stVal == "九"} { set i_stval "9" } if {$s_stVal == "十"} { set i_stval "10" } if {$s_stVal == "百"} { set i_stval "100" } if {$s_stVal == "千"} { set i_stval "1000" } if {$s_stVal == "万"} { set i_stval "10000" } set ret $i_stval return $ret } #数字から漢字へ変換(計算結果) proc numKan {s_ret} { set result "" if {$s_ret == "1"} { set result "一" } if {$s_ret == "2"} { set result "二" } if {$s_ret == "3"} { set result "三" } if {$s_ret == "4"} { set result "四" } if {$s_ret == "5"} { set result "五" } if {$s_ret == "6"} { set result "六" } if {$s_ret == "7"} { set result "七" } if {$s_ret == "8"} { set result "八" } if {$s_ret == "9"} { set result "九" } if {$s_ret == "10"} { set result "十" } if {$s_ret == "100"} { set result "百" } if {$s_ret == "1000"} { set result "千" } if {$s_ret == "10000"} { set result "万" } set ret2 $result return $ret2 } #たす数たされる数を桁数分取得する処理 proc kResp {tmpchar} { set len [string length $tmpchar] set i 0 while {$i < $len} { set tmpletter [string index $tmpchar $i] incr i set retRes [kanNum $tmpletter] #if {$tmpletter == "一"} { # set k_tal [expr $retRes * 100] # append ret3 $k_tal #} else { append ret3 $retRes #} } return $ret3 } eval { #ファイルパスの設定 set file_in "D:/tcl/Q.txt" set file_out "D:/tcl/A.txt" set iFile [open $file_in r] while {[gets $iFile line] != -1} { set lines(a) {} # if {[string match "*+*" $line]} { set qstring [lindex [split $line "="] 0] set s_stVal [lindex [split $qstring "+"] 0] set s_stVal2 [lindex [split $qstring "+"] 1] ##計算value1 set n_forwa [kResp $s_stVal] set r_kResp $n_forwa puts $r_kResp ##計算value2 set n_forwa2 [kResp $s_stVal2] set r_kResp2 $n_forwa2 puts $r_kResp2 ##計算結果 set s_ret [expr $r_kResp + $r_kResp2] puts $s_ret set str3 $s_ret set len3 [string length $str3] set i 0 while {$i < $len3} { set tmpchar3 [string index $str3 $i] incr i set sum [numKan $tmpchar3] puts $sum } append r_result $sum puts $r_result } lappend lines(a) "$line$r_result" } set oFile [open $file_out w] foreach line $lines(a) { puts $oFile "$line" } close $oFile }

質問者が選んだベストアンサー

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

値を表す文字 (「一」~「九」) と位取りを表す文字 (「十」や「百」, 「千」など) とは意味が違うんだから, まとめて処理しようとすると困るかもしれん. まず「一」~「九」を数値に直す手続を作って, それを使って 9999 までを処理できるような手続を作る. そうすれば「万」, 「億」などと組合せて表すことができる全ての数値を変換することができる. 同じ質問が 2つの異なる ID から出ているのはなんでだろう. 「1人で複数の ID を使っちゃいけない」きまりだったはずなんだけど.... 双子とかかなぁ?

参考URL:
http://okwave.jp/qa/q7926664.html
viajero365
質問者

お礼

お礼が大変遅くなり申し訳ありません。アドバイスありがとうございます。

関連するQ&A

  • Tcl言語で漢数字変換を含んだ計算処理

    長文失礼します。 二百五+十= を読み込み、書き込みファイルへ 二百五+十=二百十五 と出力することが今回実行したいことです。 下記ソースで、 例)三四+一五二=一八六 といった計算処理までは行えています(エラー処理は未実装)。 追記したいのは、十、百、千、万を含んだ漢数字を数字変換する処理です。 二百→2*100 五→5 →205といった処理の実装がうまくいかず困っています。 基本的な事項についての質問ですが、ご教授いただけないでしょうか。 よろしくお願いします。 #漢字から数字へ変換 proc kanNum {s_stVal} { set i_stval "" if {$s_stVal == "一"} { set i_stval "1" } if {$s_stVal == "二"} { set i_stval "2" } if {$s_stVal == "三"} { set i_stval "3" } if {$s_stVal == "四"} { set i_stval "4" } if {$s_stVal == "五"} { set i_stval "5" } if {$s_stVal == "六"} { set i_stval "6" } if {$s_stVal == "七"} { set i_stval "7" } if {$s_stVal == "八"} { set i_stval "8" } if {$s_stVal == "九"} { set i_stval "9" } if {$s_stVal == "十"} { set i_stval "10" } if {$s_stVal == "百"} { set i_stval "100" } if {$s_stVal == "千"} { set i_stval "1000" } if {$s_stVal == "万"} { set i_stval "10000" } set ret $i_stval return $ret } #数字から漢字へ変換(計算結果) proc numKan {s_ret} { set result "" if {$s_ret == "1"} { set result "一" } if {$s_ret == "2"} { set result "二" } if {$s_ret == "3"} { set result "三" } if {$s_ret == "4"} { set result "四" } if {$s_ret == "5"} { set result "五" } if {$s_ret == "6"} { set result "六" } if {$s_ret == "7"} { set result "七" } if {$s_ret == "8"} { set result "八" } if {$s_ret == "9"} { set result "九" } if {$s_ret == "10"} { set result "十" } if {$s_ret == "100"} { set result "百" } if {$s_ret == "1000"} { set result "千" } if {$s_ret == "10000"} { set result "万" } set ret2 $result return $ret2 } #たす数たされる数を桁数分取得する処理 proc kResp {tmpchar} { set len [string length $tmpchar] set i 0 while {$i < $len} { set tmpletter [string index $tmpchar $i] incr i set retRes [kanNum $tmpletter] #if {$tmpletter == "一"} { # set k_tal [expr $retRes * 100] # append ret3 $k_tal #} else { append ret3 $retRes #} } return $ret3 } eval { #ファイルパスの設定 set file_in "D:/tcl/Q.txt" set file_out "D:/tcl/A.txt" set iFile [open $file_in r] while {[gets $iFile line] != -1} { set lines(a) {} # if {[string match "*+*" $line]} { set qstring [lindex [split $line "="] 0] set s_stVal [lindex [split $qstring "+"] 0] set s_stVal2 [lindex [split $qstring "+"] 1] ##計算value1 set n_forwa [kResp $s_stVal] set r_kResp $n_forwa puts $r_kResp ##計算value2 set n_forwa2 [kResp $s_stVal2] set r_kResp2 $n_forwa2 puts $r_kResp2 ##計算結果 set s_ret [expr $r_kResp + $r_kResp2] puts $s_ret set str3 $s_ret set len3 [string length $str3] set i 0 while {$i < $len3} { set tmpchar3 [string index $str3 $i] incr i set sum [numKan $tmpchar3] puts $sum } append r_result $sum puts $r_result } lappend lines(a) "$line$r_result" } set oFile [open $file_out w] foreach line $lines(a) { puts $oFile "$line" } close $oFile }

  • Integerで変換する前に、0~9までの数字か判別したいです。

    /* Integerで変換する前に、0~9までの数字かどうか判別したいです。 入力した文字が'0'~'9'までの文字かどうか判別し、 trueなら、int len = Integer.parseInt(line) で変換し、 lenが1~10までの数値かどうか判別し、trueならwhileを抜ける それ以外は、もう一度入力するプログラムなのですか、 うまく作れなくて困ってます。 コンパイルはできましたが、入力時に入力が入らない現象がおきました。Ctrl + C では戻れます。 ここのプログラムが間違っているのですが、 if (line.length() != 0 && '0' >= line.charAt(i) && line.charAt(i) <= '9') { 何かいい方法はありませんか? */ import java.io.*; public class Kazuate { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // 宣言 StringBuffer sb = new StringBuffer(); String line = null; // 桁数を入力 System.out.print("1~10までの値: "); while (true) { for (int i = 0; i < len; i++) { line = reader.readLine(); if (line.length() != 0 && '0' >= line.charAt(i) && line.charAt(i) <= '9'){ int len = Integer.parseInt(line); if (Integer.parseInt(line) >= 0 && Integer.parseInt(line) <= 10) { break; } } System.out.print("入力が間違っています。もう一度を入力して下さい。\n" + "桁数(1~10までの値): "); continue; } break; } } System.out.print("入力した値は" + len + "です。"); } }

  • Linux C言語 ソケット通信について

    C言語でソケット通信のプログラムを始めて作成しました。 受信時のデータ量が少ない場合は問題ないのですが、データ量が多くなると、 サーバーの受信が、出来たり、出来なかったりと不安定になります。 ログを確認しますと、パケットが勝手に分割されサーバーで受信した場合に、 おかしな動きになることがわかりました。 なぜそのようになるのか、また何がいけないのかわかりません。 どうぞご教授をお願いします。 FD_ZERO(&r_socket); FD_SET(sock, &r_socket); width = sock+1; *leng = 0; ef = TRUE; memset(&s,0x00,sizeof(s)); /* タイムアウト設定 */ time.tv_sec = 3; time.tv_usec = 0; while(1) { /* 受信待機 */ ret = select(width, &r_socket, NULL, NULL, &time) if ( ret < 0 ) { "受信待機エラー"表示 break; } if ( ret = 0 ) { "タイムアウトエラー"表示 break; } /* パケットを受信 */ if ( FD_ISSET(sock, &r_socket)) { memset(&rb,0x00,sizeof(rb)); read_len = read(sock, rb, sizeof(rb)); "受信した内容をログに出力" /* 割り込み中断エラーは継続し、その他エラーは終了する */ if ( read_len < 0 ) { if ( errno == EINTR ) { continue; } else { ef = FALSE; "受信エラー"表示 break; } } /* クライアントのソケットが閉じた場合は終了する */ if ( read_len == 0 ) { break; } /* データ送信要求を受信した場合は終了する */ if ( rb[read_len-1] == ACK ) { break; } /* 受信バッファーへ取り込み */ if ( rb[read_len-1] == ETX || rb[read_len-1] == ETB ) { len = read_len - 1; } else { len = read_len; } for (i = 0;i < len;i++) { if ( rb[i] != ETB ) { rsbuf[(*leng)++] = rb[i]; } } /* 最終データ時は終了する */ if ( rb[read_len-1] == ETX ) { break; } /* 最終データでない場合はデータ送信要求を送信する */ if ( rb[read_len-1] == ETB ) { sprintf(trxmsg,"%1c",ACK); ef = send_socket(sock, strlen(trxmsg), trxmsg); if ( ef != TRUE ) { break; } } } }

  • Integerで変換する前に、0~9までの数字か判別したいです。

    /* // 桁数入力 の処理の部分で、Integerで変換する前に、0~9までの数字かどうか判別したいです。 入力した文字が'0'~'9'までの文字かどうか判別し、 trueなら、int len = Integer.parseInt(line) で変換し、 lenが1~10までの数値かどうか判別し、trueならwhileを抜ける それ以外は、もう一度入力するプログラムなのですか、 うまく作れなくて困ってます。 コンパイルはできましたが、入力時に入力が入らない現象がおきました。Ctrl + C では戻れます。 ここのプログラムが間違っているのですが、 if (line.length() != 0 && '0' >= line.charAt(i) && line.charAt(i) <= '9') { 何かいい方法はありませんか? */ // 数当てゲーム import java.io.*; public class Kazuate { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // 宣言 StringBuffer sb = new StringBuffer(); // ランダムで生成したlen桁の数値 → 文字列にしたもの String line = null; // 入力文字 int len = 0; // 答えの桁数 int n = 0; // ランダムの数値記憶用 int counter = 0; // 比較回数 int match = 0; // 位置と数字が一致した数 int hit = 0; // 数値が一致した数 int linecounter = 0; // 重複チェック用カウンタ // 桁数を入力 System.out.print("1~10桁の数値当てゲームです。\n" + "同じ数値は出ないようになっています。\n" + "何桁の数当てゲームをやりますか?\n" + "桁数(1~10までの値): "); while (true) { for (int i = 0; i < len; i++) { line = reader.readLine(); if (line.length() != 0 && '0' >= line.charAt(i) && line.charAt(i) <= '9'){ len = Integer.parseInt(line); if (Integer.parseInt(line) >= 0 && Integer.parseInt(line) <= 10) { break; } } System.out.print("入力が間違っています。\n" + "もう一度を入力して下さい。\n" + "桁数(1~10までの値): "); continue; } break; } // コンピュータが数を生成 do { n = (int)(Math.random() * 10); line = String.valueOf(n); if (sb.toString().indexOf(line) == -1 || sb.length() == 0) { sb.append(n); } } while (sb.length() != len); //デバッグ用に表示 System.out.println(sb.toString()); //数当て outer: while (true) { line = null; match = 0; hit = 0; counter++; System.out.print(counter + "回目の比較\n" + "答えは? :"); line = reader.readLine(); // 入力した桁数の間違いをチェック if (line.length() == 0 || line.length() != sb.length()) { System.out.println("桁数が違います。"); counter--; continue; } for (int i = 0; i < len; i++) { for (int j = i + 1; j < len; j++) { if (line.charAt(i) == line.charAt(j)) { System.out.println("同じ数値を入れないで下さい。"); counter--; continue outer; } } } // 入力した数値とコンピュータの生成した数値を比較 // matchとhitをカウント match = 0; hit = 0; for (int i = 0; i < len; i++) { if (sb.charAt(i) == line.charAt(i)) { match++; } for (int j = 0; j < len; j++) { if (sb.toString().charAt(i) == line.charAt(j)) { hit++; } } } // 判定・表示 if (sb.toString().equals(line) == false) { System.out.print("間違いです\n" + "match(位置と数字が一致した数) = " + match + "\n" + "hit(数値が一致した数) = " + hit + "\n"); } else { System.out.println("正解です。\n" + "答えは" + sb.toString() + "です\n" + "お疲れさまでした。"); break; } } } }

    • ベストアンサー
    • Java
  • C言語で分からないところがあるのですが

    すみません。C言語のポインタで分からないことがあって来ました。 ポインタの理屈は理解してはいるのですが、いざソースコードを書いてみようということになると全く手がつけられずにいます。 以下のソースコードですが、strlen()と同じ働きをする関数mystrlen()と、strcmp()と同じ働きをする関数mystrcmpを、ポインタを使って作成するものです。どこをどうすればいいのか教えてくださいませんか。 #include <stdio.h> int main(void) { char str1[80], str2[80]; int i, j; int len1, len2; printf("第1の文字列を入力してください: "); gets(str1); printf("第2の文字列を入力してください: "); gets(str2); /* * 文字列の長さを確認する */ /* NULL文字(文字列の最後)まで読み飛ばす */ for (len1 = 0; len1 < 80 && str1[len1] != '\0'; len1++) ; /* ループ終了後、len1 に文字列の長さが入っている */ if (len1 < 80) { printf("%s は %d 文字の長さです\n", str1, len1); } else { printf ("第1の文字列が80字以上あります\n"); } /* str2 についても同様 */ for (len2 = 0; len2 < 80 && str2[len2] != '\0'; len2++) ; if (len2 < 80) { printf("%s は %d 文字の長さです\n", str2, len2); } else { printf ("第2の文字列が80字以上あります\n"); } if (len1 < 80 && len2 < 80) { for (i = 0; i < 80 && str1[i] != '\0' && str2[i] != '\0' && str1[i] == str2[i]; i++) ; if (str1[i] == str2[i]) { /* 両者同時に == '\0' のはず*/ printf("文字列は等しい\n"); } else if (str1[i] < str2[i]) { /* str1[i] == '\0' のはず*/ printf("%s は %s より小さい\n", str1, str2); } else { /* str2[i] == '\0' のはず*/ printf("%s は %s より大きい\n", str1, str2); } } /* * 十分なスペースがあれば、str2をstr1の最後に連結する */ if (len1 + len2 < 80) { /* str1 の末尾を探す */ for (i = 0; str1[i] != '\0'; i++) ; /* ループを抜けた段階では i は len1 と同じはずなので、 上記のループを作らず、i の代わりに len1 を用いるのも可 */ /* それ以降に str2 の中身をコピーする */ for (j = 0; str2[j] != '\0'; j++) { str1[i+j] = str2[j]; } str1[i+j] = '\0'; printf("%s\n", str1); } else { printf ("文字列をつなげた長さが80字以上あります\n"); } /* * str2をstr1にコピーする */ if (len1 + len2 < 80) { for (i = 0; str1[i] != '\0'; i++) { str1[i] = str2[i]; } str1[i] = '\0'; printf("%s %s\n", str1, str2); } return 0; }

  • C言語のエラー処理について

    下記のコードを作成したのですが、入力エラーの際に出力される表示が意図した input error の出力と違う形で表示されてしまい、修正方法が分からず、どなたか教えて頂けないでしょうか? ・『あ』等の整数以外の文字が入力された時 input errorinput errorinput error ・/0が入力された時 input error input error input error 「ソースコード」 #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, float* ans) { switch (op) { case '+': *ans = (float)*n1 + n2; break; case '-': *ans = (float)*n1 - n2; break; case '*': *ans = (float)*n1 * n2; break; case '/': if (n2 == 0) { puts("input error"); return 1; } *ans = (float)(float)*n1 / n2; break; default: printf("input error"); return 1; break; } 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 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) { scanf("%d%c%d", &num1, &op, &num2); calc_proc(&num1, op, num2, &answer); if (calc_proc(&num1, op, num2, &answer) != 0) { puts("input error"); return 1; } 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"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } 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; }

  • malloc関数(strtok関数の自作版)につきまして分からないこと

    malloc関数(strtok関数の自作版)につきまして分からないことがあります。 以下のプログラムにmallo関数がフリーする最適な位置を明示しなさいといわれました。 文字が分離した時にfreeすると助言されたのですが いまいち理解できません・・・。 条件式の中で使用するともいわれていました。(おそらくif文・・・。) 色んな意見を参考にしたいので詳しい方助言のほうよろしくおねがいします。 なおプログラムはほかの箇所を変更したり、他の場所でもmalloc関数を使用することが認められています。 またfreeする場所はメイン関数ではなくあくまでもstrtok関数の中で宣言するようです。 よろしくお願いします。 #include <string.h> #include <stdio.h> #include <stdlib.h> main(){ char* s2 = ",/"; char* result; char* r1; char* r2; char* r3; char* r4; result = strtok("//123//,45/,678,9/","/,"); r1 = strtok(NULL, s2); r2 = strtok(NULL, s2); r3 = strtok(NULL, s2); r4 = strtok(NULL, s2); printf("%s\n",result); printf("%s\n",r1); printf("%s\n",r2); printf("%s\n",r3); printf("%s\n",r4); return; } char *strtok(char *s1, const char *s2) { int i,len; char *str1, *str2 , *str3; static char *tok ; static char* mstr; if(s1 != NULL) { str1 = s1; } else { str1 = tok; } str2 = str1 + strspn(str1, s2); /* strspnを利用 */ if (*str2 == '\0') { return (NULL); } len = 1; i = 0; while(*(str2 + i) != '\0'){ len++; i++; } mstr = (char*)malloc(sizeof(char)*len); if(mstr == (NULL)) { return 0; } i = 0; while(*(str2 + i) != '\0'){ *(mstr + i) = *(str2 + i ); i++; } *(mstr + i ) = '\0'; str3 = mstr + strcspn(mstr, s2); /* strcspnを利用 */ if (*str3 != '\0'){ *str3 = '\0'; str3 = str3 + 1; } tok = str3; return (mstr); }

  • C言語でファイルから特定の文字を抽出

    現在C言語でプログラム開発しています。 文字列が並んだテキストファイルから特定の部分のみを抽出したいのですが、うまくいきません。 お力を貸していただけないでしょうか。 テキストファイルの構造はこんな感じです。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 文字列 文字列 文字列badresult=*****文字列badresult=*****文字列badresult=*****文字列result=***** ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー これが10セット程記述されたファイルです。 ここから全てのbadresultの数値とresultの数値を抽出したいのです。 私が現段階で作成したプログラムがこちらです。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXLINE 2084 int main(void){ FILE *fp; char line[MAXLINE]; char s1[]="badresult"; char s2[]="result="; char *r; if ((fp = fopen( "テキストファイルへのダイレクトパス", "r" )) == NULL){ printf("エラーメッセージB\n"); exit(1); } while (fgets(line, MAXLINE, fp) != NULL){ if(strstr(line,s1)!=NULL){ printf("%.27s",strstr(line, s1),"\n"); printf(" "); printf(strstr(line, s2)); } } } ですがこれだと1行に全てのbadresultが含まれているため、結果は ----------------------------- badresult=***** result=****** ----------------------------- とbadresultは1つしか出てきません。 strstrのポインタをどうにかできないかと考えたのですが、 私のC言語の知識も浅いためなかなかうまくできません。 Cプログラミングに精通している方、どうか改善策を教えていただけないでしょうか。 できればなるべく簡単な方法ですと助かります。

  • C言語の課題なのですが、助けてください

    C言語のプログラミングの課題で、「以下のプログラムをキーワードを引数として入力できるように変更する(argvを利用する)」という問題なのですが、プログラミングが苦手な私にはさっぱりわからず、大変困っています。設問のプログラミングがわかる方がいらっしゃいましたら、教えていただけると大変助かります。よろしくお願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LEN 256 int main(int argc, char *argv[]) { FILE *rfp; FILE *wfp; int i, score; double evalue; char id[MAX_LEN], name[MAX_LEN], fname[MAX_LEN]; char keyword[] = "glu"; for(i = 0; i < 100; i++){ sprintf(fname,"files/%d.txt",i); if((rfp = fopen(fname, "r")) == NULL) { printf("入力ファイルが存在しません。\n"); return (EXIT_FAILURE); } while (fscanf(rfp,"%s\t%s\t%d\t%f", id, name, &score, &evalue) != EOF){ if (strstr(name,keyword) != NULL){ printf("%s\n",id); } } fclose(rfp); } return (EXIT_SUCCESS); }

  • 処理を別ファイルに書きたいんですが。

    ASPのコード部分で、 いろんなファイル共通の処理(更新日付を表示用に編集する等)をまとめて一つの別ファイルに記述し、 各ファイルの処理内で、呼び出して使用したいのですが。 ◎呼び出し側 <!--#include file="abc.asp"> として、aspコード内で、 call Change_Ymdhms(w_Tymd,w_Thms) と書いてます。 ◎呼び出される側 abc.aspの中では、 function Change_Ymdhms(w_Ymd,w_Hms) dim w_Len dim R_Ymdhms w_Len = len(w_Tymd) if w_len < 8 then w_Ymd = string((8 - w_Len),"0") & w_Tymd end if w_Len = len(w_Hms) if w_len < 6 then w_Thms = string((6 - w_Len),"0") & w_Thms end if R_Ymdhms = mid(w_Ymd,1,4) & "/" & mid (w_Ymd,5,2) & "/" & mid(w_Ymd,7,2) & " " & _ mid(w_Yms,1,2) & ":" & mid(w_Yms,3,2) & ":" & mid(w_Yms,5,2) end function とファンクションが書いてあります。 呼び出し側のaspファイルを実行すると、 「ページを表示できません」となり、 「Subプロシージャを呼び出すときに括弧を使うことはできません」というエラータイプが表示されます。 本で探しても見つけられず、「こうすればどうか・・・」 と思い、書いてみましたが、上手くいきません。 (当たり前ですが・・・) どなたかご存知でしたら、どうか教えてください。 よろしくお願いします。

専門家に質問してみよう