-1

ユーザーが1〜3桁の文字列に続いてバックスラッシュ、さらに1〜3桁を入力するか、1〜3桁に続いてコンマ、さらに1〜3桁を入力できるCプログラムを作成していますこれを繰り返す回数に制限はありません。

入力区切り文字がバックスラッシュかカンマかを判断し (数値をどう処理するかを判断するため)、数値を配列に入れる必要があります。

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

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

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

これは、バックスラッシュで区切られたものには機能しますが、コンマでは機能しません。これは、strtok がトークン変数をいじるためだと思います。これは本当ですか?これについてもっと良い方法はありますか?ありがとう!

4

3 に答える 3

2

私がより良いと考える方法は確かにあります。入力の形式 (つまり、実際には 3 桁の数字の後に許可された区切り文字の 1 つが続く) に十分に依存できる場合は、次のようにすることができます。

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;
}
于 2012-04-27T21:56:48.883 に答える
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$
于 2012-04-28T00:59:08.000 に答える
0

他の人がより良い解決策を投稿しています - strtok はこのタスクにはあまり適していません。ただし、最初の質問に答えると、strtok は基になる文字列を変更します。はい (それがどのように機能するかは私の考えでは悪です。多くの若いプレーヤーがこの罠に陥っています):

strtoktoken を\0(Null ターミネータ) に置き換え、文字列の先頭を渡します。strtok(NULL, <token>)次のトークンを探して、文字列のスキャンを続行するための後続の呼び出し。同じである必要はありません。

したがって、次のことができます。

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

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

また、スレッドセーフではないことに注意してください。

于 2012-04-28T00:01:41.040 に答える