あなたの問題は%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