Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

printf系の書式文字列のエスケープでハマったけど解決した

スポンサードリンク


printf系の書式(フォーマット)文字列でエスケープしなきゃなんないのはどれかわかってなくてハマりました。

正解のコード

    char buffer[80];
    char format[20];    // 20もあれば用は足りるので……
    printf("なんかいれてね : ");
    //sprintf(format, "%%%d[^\\n]%%*[^\\n]", 80 - 1);  // これは間違い
    sprintf(format, "%%%d[^\n]%%*[^\n]", 80 - 1); // 文字数と空白文字を考慮
    scanf(format, buffer);
    getchar();  // 入力ストリームを空にする
    puts(buffer);

即値使っているのは気にしないで下さい……。
sprintf(format, "%%%d[^\\n]%%*[^\\n]", 80 - 1);
と書いていてあれれーってなっていました。
\マークが出ると無条件にエスケープしたくなりますが、
printf系の場合はエスケープしちゃダメなのね……。
正しくは
sprintf(format, "%%%d[^\n]%%*[^\n]", 80 - 1);
ちなみに素直にsprintfを使わずに指定する場合は
scanf("%79[^\n]%*[^\n]", buffer);でOKです。
エスケープすべきは%のみです。

参考

scanf - Wikipedia
…なんというscanfマニアックな記事w
あんまり使わないですよね……。
ふーん正規表現チックなことができるんだと感心。