2017-01-22 24 views
-1
でsscanf関数を使用してトラブル

を持っています、は、私は次の行を持っているC

*"1 $This is an open field west of a white house, with a boarded front door.$ 2 -1 -1 -1"* 

6つのSTR内の値があります:南部屋番号、説明、北、東、西

は、 ----「$」私は最初の2つの要素のためのsscanfを正常に使用している

記述構造体のvariabl内入力するべきではありません

sscanf(line, "%d",&room[count].room_number); 
sscanf(line, "%*[^$]%*c%[^$]s", room[count].description); 

北、南、東、西の値を取得するのに問題があります。

"%*[^$]%*[^$] %d" 

strからnorth値(2になるはずです)を取得するための適切な区切り文字は、

+0

? &room [count] .room_number、room [count] .description、&room [count] .north、&room(sscanf(行)、%d%d%d%d% {/ *成功* /} else {/ *不良行* /} '(' char記述[100];と仮定して、 ')? –

+1

'sscanf'はあなたの行の位置を追跡しません。一度にすべてを読んだり、異なる位置で 'sscanf'を起動したりする必要があります。 '%['と '%s'は2つの異なる指定子でもあり、'%[^ $] s'は最後に 's 'を期待します。 – aragaer

+1

@aragaer '"%n "'は行の位置を追跡します。 – chux

答えて

2

複雑なsscanf()をコーディングする方が簡単です:フォーマットを形成するために

  1. 使用#defineと文字列リテラルの連結。
  2. 成功のために最後に" %n"を使用してください。

これにより、より明瞭なコーディングが可能になります。 "%99[^$]"は、の非ドル記号文字までスキャンする指定子です。 は、主に$でスキャンされないため失敗します。

"%99[^$]"の末尾には、が必要です。あなたはすべての6つを変換するために、単一のsscanfを使用していないのはなぜ@aragaer

#include <stdio.h> 
#include <stdlib.h> 

#define F_PRE "*\"" 
#define F_RML " $" 
#define F_RMR "$" 
#define F_END "\"*" 

int main(void) { 
    const char *line = "*\"1 $This is ... door.$ 2 -1 -1 -1\"*\n"; 
    int Room_number, north, south, east, west; 
    char description[100]; 
    int n = 0; 
    sscanf(line, F_PRE "%d" F_RML "%99[^$]" F_RMR "%d" "%d" "%d" "%d" F_END " %n", 
     &Room_number, description, &north, &south, &east, &west, &n); 
    if (n && (line[n] == '\0')) { 
    printf("%d <%s> %d %d %d %d\n", Room_number, description, north, south, east, west); 
    } else { 
    puts("Fail"); 
    } 
    return 0; 
} 

出力

1 <This is ... door.> 2 -1 -1 -1 
+0

'sscanf'の戻り値を確認することもお勧めします。それは7でなければなりません。 – aragaer

+0

@aragaerなぜ示唆されているのかわかりません。7. 'sscanf()'の詳細、特に戻り値に寄与しない ''%n "'部分を見直したい場合があります。この場合、戻り値をチェックしてもコードの機能は向上しません。 'n> 0'の場合、最後の' int'の後に '\" * "を含めてフォーマット全体がスキャンされたので、戻り値は6にしかなりませんでした。その逆は真ではなく、戻り値は6最後の 'int'の後ろに' n'がまだ0の場合、スキャンは\ "*" 'と一致しませんでした。 – chux

+0

設定する引数の数を数えたところです。私がこの種の解析を行うとき、私は '%n'を' sscanf'の戻り値だけに依存させません。しかし、例えば、最後の引数が数字であり、いくつかの訓練された非数字文字がある場合、 '%n'はポイントを持つかもしれません。 – aragaer

関連する問題