0

与えられた文字列

[FROM] Jan 5 2013 10:16:41 widget <__FILE__> <__LINE__>

「周辺機器」、この場合は「ウィジェット」を抽出したいと思います。

「peripheral」の名前は常に同じ列で始まりますが、長さが異なる可能性があるため、memcpy()またはstrncpy()を使用し、strchr()を使用してスペースの位置を取得できると思います。私はそれを行い、機能するコード回答を受け入れます。

ただし、Cでコーディングしてからしばらく経っているので、少し注意が必要なので、次のことを試しました。

     char traceDirection[11];
     char month[4];
     char day[3];
     char year[5];
     char hour[3];
     char min[3];
     char sec[3];
     sscanf(line,"%s %s %s %s:%s:%s %s %s",  
                  traceDirection, month, day, year, hour, min, sec, peripheralName);

時間、分、秒まではすべて問題ありません。HH:MM:SSのコロンが原因である可能性があります。

使用しているかどうかに関係なく、そのような文字列からペリフェラルの名前を取得するためのコードを誰かに教えてもらえますかsscanf()(残りは気にしません)。

  • 行は常に同じ形式です
  • 周辺機器の名前は常に同じ列から始まります
  • ただし、固定長ではありません。スペースで終了します

前もって感謝します。これは、言語間をジャンプするときに起こることです:-(

4

4 に答える 4

2

フォーマット文字列は次のようになります。

"%s %s %s %s %2s:%2s:%2s %s"

%sのコロンで区切られたブロックの前に%2s:%2s:%2s4つ必要HH:MM:SSであり、コードには3つしかありませんでし%sた。また、、、およびの文字列は文字HHMM限定SSする必要があり2ます。それ以外の場合は、全体10:16:41が文字列に読み込まれhourます。

これがideoneのデモへのリンクです。

于 2013-01-05T04:11:54.320 に答える
2

整数を読み取るために使用intし、NOT を 使用しますchar

 int day, year, hour, min, sec;
 sscanf(line,"%s %s %d %d %d:%d:%d %s",  
         traceDirection, month, &day, &year, &hour, &min, &sec, peripheralName);

イデオネを見る

prefipheralName のみを読み取るには、これを使用します。

sscanf(line,"%*[^:]%*s %s", peripheralName);

here%*[^:]は、 first より前のすべてに一致し:ます。次に%*s、最初のスペースより前のすべてに一致します。しかし、このスキャンのどれも変数を割り当てません。最後%sに普通にスキャンして に割り当てるだけperipheralNameです。

于 2013-01-05T04:27:01.297 に答える
1

上記の例では、%sフォーマット指定子がすべての非空白文字を消費するため、時間はすべての HH:MM:SS を取得しています (バッファーをオーバーランしています)。それらを 2 文字に制限するには、次のようにします%2s

同様に、PCRE の方が役立つ場合もあります。

于 2013-01-05T04:18:31.387 に答える