0

次のような行を解析しようとしています

1            {2}           {2,3}         {4}

4 つの異なる文字配列に

ここで、1 は '1','\0' です

括弧内の他の数字はそれぞれ「2」です

'2','3'

'4'

dilems " \t}" で strtok を試しました。また、最初の列に %s を渡し、残りの列に "{%S}" を渡して sscanf を試しました。どちらも私に期待される結果を与えていません。誰かが私に正しい方向へのプッシュを与えることができますか?

4

1 に答える 1

1

あなたの問題は%S、スペースで終了する単語を解析することです(したがって、文字列の一部として「}」を読み取ります。

fscanf(stream, "{%[^}]}", buffer);

「{}」の間の文字をスキャンしてバッファに入れます。
注: ここでは、バッファ オーバーフローにも注意する必要があります。

"{%[^}]}"
{             -> Matches {
%[<char>]     -> Matches a sequence of characters that match any of the characters in <char>
                 If the first character is ^ this makes it a negative so any characters that
                 do not follow the ^
%[^}]         -> Matches a sequence of characters that does not match `}`
}             -> Matches }

しかし、私は数字を個別に解析しようとします。

// If the input does not contain '{' next then we get an error and the
// next section of code is not entered.
if (fscanf(stream, " {") != EOF)
   // Note: The leading space matches one or more white space characters
   //       So it is needed to get passed leading white space.
{
    // We enter this section only if we found '{'
    int  value;
    char next;
    while(fscanf(stream, "%d%c", &value, &next) == 2)
    {
        // You have an integer in value
        if (next == '}')
        {    break;
        }
        if (next == ',')
        {    continue;
        }
        // You have an error state  the next character after the number was not
        // a space or a comma ',' or end of section '}'
    }
}

編集(使用中を表示するため)

このコードで:

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

int main()
{
    while (scanf(" {") != EOF)
    {   
        printf("Enter BLOCK\n");

        int  value;
        char next;
        while(scanf("%d%c", &value, &next) == 2)
        {   
            if ((next == '}') || (next == ','))
            {   
                printf("\tVALUE %d\n",value);
            }   

            if (next == '}')
            {    break;
            }   
            if (next == ',')
            {    continue;
            }   

            printf("ERROR\n");
            exit(1);
        }   
        printf("EXIT BLOCK\n");
    }   
}

次に、次のように使用します。

> gcc gh.c 
> echo "  {2}           {2,3}         {4}" | ./a.out
Enter BLOCK
    VALUE 2
EXIT BLOCK
Enter BLOCK
    VALUE 2
    VALUE 3
EXIT BLOCK
Enter BLOCK
    VALUE 4
EXIT BLOCK
于 2012-10-01T23:29:18.160 に答える