-1

編集:

もう一度、より正確に説明しようと思います。

IRC クライアント (ソケットに基づくネットワーク アプリケーション) を作成しています。recv()関数を使用してサーバーからデータを受信し、それらをrBuf[]配列に 1 文字ずつ格納します。
次に、それらを配列にコピーしてrBufh[]、解析関数に渡します。
重要なことは、サーバーが一度に 1 文字だけを送信することです [1 つの recv() で 1 文字] およびキー (2 つの dim.array [ key1] に格納された文字配列) は、解析メソッドが受信データでそれらの 1 つを検出した場合の文字列です。プロトコルのドキュメントで指定されている意味を表す 3 桁のコードに基づいて、適切に反応する必要があります。- 基本は。

解析アルゴリズム/関数は次のように機能します。

  1. key1(キーを含む)とrBufh 配列はそれに渡される引数です
  2. に格納されている最初の文字列の最初の文字を取得し、それを次のkey1最初の文字と比較しますrBufh
  3. それらが一致する場合は、リターンint ret = 2(「キーの一部が受信データで見つかった」ことを意味します)

ここrecv()で、1 つの文字 (サーバーは毎回 char でのみ送信するため) を配列に追加します。これは再び解析関数に渡され、一致するキーが見つかるまで(一致するキーが見つかる)、またはステップ 3 で一致しない場合はrBufh、アルゴリズムが再び開始されます。マッチ。int ret = 1int ret = 0

パーサーが動作している間、stdout への出力は停止され、パーサーから返された値に基づいて、出力が長時間停止されるか (key1配列のキーの 1 つの一部が見つかった場合)、出力が許可されます (キー全体が見つかった場合、またはパーサーは、rBufH配列で渡された文字を、に格納されているキーのいずれかと一致させることができませんkey1)

私が求めていたものを理解することに近づいています - 願っています:)

配列に格納されている文字列の量はkey1、プロトコル ドキュメントで指定されているため、事前にわかっています。そのため、定義中にすぐに初期化できます。

私が尋ねたのは:

key1「任意の3桁」を意味するコードの一部を含む文字列を 渡すことは可能ですか(必ずしも私が行ったようにsprintfを使用する必要はありません-便利に思えました)。

たとえば
、上記の 3 行のコードの部分を XXX でマークします。

key1[0] = "irc2.gbatemp.net XXX nickname"

パーサーが XXX の代わりに任意の 3 桁を含む key1[0] に一致する文字列に遭遇した場合、パーサーは 1 を返します - したがって、他の関数は適切に反応する可能性があります。

このように、XXX の値が異なる多くの文字列をkey1配列に格納する必要はありませんが、それらすべてに一致する文字列を 1 つだけ格納する必要があります。


わかりました、今、私はあなたがそれを理解し、答えを得るのを助けるために本当に最善を尽くしました:)

こんにちは
トム

PS

あなたがすでに気づいたように、問題を短い言葉でどのように説明すればよいか本当にわからないので、このトピックのタイトルを自由に変更してください。(私の最初のアイデアは、正規表現をに渡すことだったので、そのままですkey1

4

2 に答える 2

1

文字列に任意の 3 桁の数字を挿入するだけの場合は、次のようにします。

int n = 123; // some integer value that you want to represent as 3 digits
sprintf(key1[1], ":irc2.gbatemp.net %03d %s ", n, nickname);

書式指定子は正規表現ではないことに注意してください%03d。必要に応じて先頭にゼロを付けて、整数パラメータを 3 桁の 10 進数として表示することを指定しているだけです。

于 2012-05-11T21:22:19.463 に答える
0

コンパイラにそれを伝えることはできません。署名は

int sprintf ( char * str, const char * format, ... );

コンパイラはフォーマット文字列の内部を調べず、%d、%s、および int、char* を一致させることさえ確認しません。これはランタイムである必要があります。ちょうど何か

int printKey(char* key, int n) {
    if(!(0 <= n && n <= 999)) { 
        return -1; //C-style throw an error
    }
    sprintf(key, ":irc2.gbatemp.net %d %s", n, nickname);
    return 0;
}

また、sprintf ではなく snprintf を使用するか、メモリのトラブルを求めています。

于 2012-05-11T21:25:20.490 に答える