• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:次の問題でC言語で、どうプログラムを作れば・・・・)

C言語でprintfの表示処理を関数化する方法

このQ&Aのポイント
  • C言語でprintfの表示処理を関数化する方法を教えてください。
  • 関数名はVOID fc_str_Printf( CHAR *str, BYTE hst )で、strにセットした文字列を表示します。
  • 過去の文字列もstrと合わせて表示しますが、hstに指定された過去の文字列は無視されます。

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

  • ベストアンサー
回答No.2

リングバッファの管理が意外に面倒くさい気がするので、人のコードを見るのも良い勉強だと思いますしちょっと書いてみました。リングバッファのコードは直感から外れているので、うっかりすると簡単にバグを入れますしね。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_HISTORY 8 #define NUM_ENTRIES (MAX_HISTORY + 1) size_t sub(size_t x, size_t y) { return (x + NUM_ENTRIES - y) % NUM_ENTRIES; } size_t add(size_t x, size_t y) { return (x + y) % NUM_ENTRIES; } void fc_str_printf(char *str, size_t hst) { static char *history[NUM_ENTRIES]; static size_t head = 0, tail = 0; /* since head == tail means no data, num entries should be max_hst + 1 */ if (sub(tail, head) < hst) { hst = sub(tail, head); } for (size_t i = sub(tail, hst - 1); i != add(tail, 1); i = add(i, 1)) { printf("[history] %s\n", history[i]); } printf("%s\n", str); tail = add(tail, 1); if (tail == head) { /* whole data has consumed. */ free(history[head]); head = add(head, 1); } history[tail] = strdup(str); } なんでaddやsubという関数が必要かというと、リングバッファの中でのインデックスを求めるのが面倒だからです。 historyはリングバッファになっていて、head == tailのときにデータがないことを表します。そして、データを追加するごとにtailをずらしてデータを足していきます。リングバッファなのでNUM_ENTRIESを超えそうになったら先頭に戻ります。 ...足すだけで減らすことがないのはわかっているのでもうちょっとコンパクトに出来たかもしれません。

その他の回答 (3)

回答No.4

(2)CALLされるたびに文字列を記録しておき、  hstに指定された過去の文字列もstrと合わせて表示する  ※過去分以上の値を設定された場合は無視する とあります。 ここで何が浮かんできますか? 何かしらデータを保存する方法が必要になると思います。 それが分かればこんなの簡単ですね。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

strの示す文字列の最大長とかが明記されていないので、あまりいい問題じゃないですね。 strdupとか使ってもいいのかな。 まあ、課題なので、この場合は文字列長を適当に制限するんでいいと思うけど。 リングバッファは確かに効率はいいかもしれないけど、質問者さんのレベルでリングバッファなんか使ったら、誰かに聞いたことがまるかわりなので、やめたほうがいいかも。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

>機能: >(1)strにセットした文字列を表示する >(2)CALLされるたびに文字列を記録しておき、 > hstに指定された過去の文字列もstrと合わせて表示する > ※過去分以上の値を設定された場合は無視する まず……(1)の機能を実装することはできますか? (2)の機能を実装する為には、関数がコールされた後も内容を保持し続けられる変数が必要になりますが、 どういう記憶クラスを使用したらいいか判りますか? https://www.google.co.jp/search?q=C%E8%A8%80%E8%AA%9E+%E8%A8%98%E6%86%B6%E3%82%AF%E3%83%A9%E3%82%B9&ie=utf-8&oe=utf-8

関連するQ&A