C、215バイト、196バイト
@tucuxiのおかげで19バイトが節約されました!
ゴルフ:
char i[99],o[999],b[99],z[99];t,x,n,c;main(){gets(i);sscanf(i,"%s %[^[]s",b,z);while(sscanf(i+t,"%*[^0-9]%d%n",&x,&n)==1)sprintf(o,"%s[%d] = %d;\n",z,c++,x),t+=n;printf("%s %s[%d];\n%s",b,z,c,o);}
ゴルフをしていない:
/*
* Global strings:
* i: input string
* o: output string
* b: input array type
* z: input array name
*/
char i[ 99 ], o[ 999 ], b[ 99 ], z[ 99 ];
/* Global ints initialized to zeros */
t, x, n, c;
main()
{
/* Grab input string from stdin, store into i */
gets( i );
/* Grab the <type> <array_name> and store into b and z */
sscanf( i, "%s %[^[]s", b, z );
/* Grab only the int values and concatenate to output string */
while( sscanf( i + t, "%*[^0-9]%d%n", &x, &n ) == 1 )
{
/* Format the string and store into a */
sprintf( o, "%s[%d] = %d;\n", z, c++, x );
/* Get the current location of the pointer */
t += n;
}
/* Print the <type> <array_name>[<size>]; and output string */
printf( "%s %s[%d];\n%s", b, z, c, o );
}
リンク:
http://ideone.com/h81XbI
説明:
を取得する<type> <array_name>
ためのsscanf()
フォーマット文字列は次のとおりです。
%s A string delimited by a space
%[^[] The character set that contains anything but a `[` symbol
s A string of that character set
文字列からint値を抽出するにはint foo[] = {4, 8, 15, 16, 23, 42};
、基本的にこの関数を使用して文字列をトークン化します。
while( sscanf( i + t, "%*[^0-9]%d%n", &x, &n ) == 1 )
ここで:
i
入力文字列(a char*
)
t
のポインタ位置オフセットです i
x
int
文字列から実際に解析される
n
見つかった数字を含む消費された文字の合計です
sscanf()
フォーマット文字列は、この意味します:
%* Ignore the following, which is..
[^0-9] ..anything that isn't a digit
%d Read and store the digit found
%n Store the number of characters consumed
入力文字列をchar配列として視覚化する場合:
int foo[] = {4, 8, 15, 16, 23, 42};
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
00000000001111111111222222222233333
01234567890123456789012345678901234
でint
4
、インデックス13に位置している8
、というように、インデックス16で、これは何のようなループルックスで各実行の結果です:
Run 1) String: "int foo[] = {4, 8, 15, 16, 23, 42};"
Starting string pointer: str[ 0 ]
Num chars consumed until after found digit: 14
Digit that was found: 4
Ending string pointer: str[ 14 ]
Run 2) String: ", 8, 15, 16, 23, 42};"
Starting string pointer: str[ 14 ]
Num chars consumed until after found digit: 3
Digit that was found: 8
Ending string pointer: str[ 17 ]
Run 3) String: ", 15, 16, 23, 42};"
Starting string pointer: str[ 17 ]
Num chars consumed until after found digit: 4
Digit that was found: 15
Ending string pointer: str[ 21 ]
Run 4) String: ", 16, 23, 42};"
Starting string pointer: str[ 21 ]
Num chars consumed until after found digit: 4
Digit that was found: 16
Ending string pointer: str[ 25 ]
Run 5) String: ", 23, 42};"
Starting string pointer: str[ 25 ]
Num chars consumed until after found digit: 4
Digit that was found: 23
Ending string pointer: str[ 29 ]
Run 6) String: ", 42};"
Starting string pointer: str[ 29 ]
Num chars consumed until after found digit: 4
Digit that was found: 42
Ending string pointer: str[ 33 ]
foo[0]=1;
受け入れられるでしょうか?