2012-04-27 18 views
-1

私は、ユーザーが1-3桁の文字列を入力し、その後にバックスラッシュを入力してから1-3桁を入力できるか、1-3桁を入力できるCプログラムを作成しています。コンマ、そして別の1〜3桁の数字があり、繰り返し回数を制限することはできません。Cデリミタを決定する複数のStrtok

入力区切り記号がバックスラッシュかカンマか(番号の扱い方を決定する)かどうかを判断し、数値を配列に入れる必要があります。

私がこれを行う方法は、strtokを次のように使用することでした。文字列はchar *トークンとして入力されます。

op_tok1 = strtok(token, "\\"); 
if(op_tok1 != NULL) 
{ 
     /* Process numbers */ 
     return; 
} 

op_tok2 = strtok(token, ","); 
if(op_tok2 != NULL) 
{ 
    /* Process other numbers */ 
    return; 
} 

これは、カンマでバックスラッシュでdelimetered何のために動作しますが、ありません。私はこれがstrtokがトークン変数を混乱させるためだと信じています。これは本当ですか?これについてもっと良い方法がありますか?ありがとう!

+0

カンマstrtokで使用するために 'token'のコピーを作成しようとしましたか? – gcochard

答えて

2

私はより良い方法を考えています。あなたは(すなわち、本当に許さ区切り文字のいずれかが続く3桁の数字である)入力の形式に合理的に依存することができた場合は、何かのように行うことができます:

char *pos = 0; 

while (2 == sscanf(input+pos, "%d%c", &number, &delimiter)) { 
    if ('\\' == delimiter) 
     process_backslash(number); 
    else if (',' == delimiter) 
     process_comma(number); 
    else 
     error_invalid_delimiter(delimiter); 
    pos += 4; 
} 
+0

この場合、 'sscanf'アプローチが明らかに優れていることに私は同意します。 – jedwards

+0

*入力がうまくフォーマットされていると信頼できない場合は、getchar()で同様の方法を使用できます。基本的には、一度に 'sscanf()'ですべてを一気に読み上げるのではなく、一度に1文字ずつ読み込んで検証してください。これは 'strtok()'よりも優れていなければなりませんが、依然として無効な入力を検出する力が増します。 – bta

0

その他は、より良い解決策を掲載している - はstrtokではありませんこの作業には本当に適しています。しかし、最初の質問に答える - strtokは基本となる文字列、はい(それがどのように動作するか私の心の中でそれの悪を多くの若いプレーヤーはこの罠に陥っている。)に変化している:

strtok置き換えは\0(ヌルターミネータ)でトークンと文字列の先頭を渡します。その後の​​の呼び出しは、同じである必要はない次のトークンを探して文字列をスキャンし続けます。

したがって、あなたが行うことができます:

op_tok1 = strtok(token, "\\"); 
if(op_tok1 != NULL) 
{ 
    /* Process numbers */ 
    return; 
} 

op_tok2 = strtok(NULL, ","); 
if(op_tok2 != NULL) 
{ 
    /* Process other numbers */ 
    return; 
} 

また、それが安全スレッドではないです注意してください。

0

scanf()を使用しないのはなぜですか?

~/tmp$ cat test.c 
#include <stdio.h> 
int main(int argc, char ** argv) { 
    int i; 
    char c; 
    while (2 == scanf("%d%[\\.]",&i,&c)) { 
     printf("Int %d\nChar %c\n", i, c); 
    } 
} 

...私のために働いた。

~/tmp$ gcc test.c && echo "123.456\789.4" | ./a.out 
Int 123 
Char . 
Int 456 
Char \ 
Int 789 
Char . 
~/tmp$ 
関連する問題