| 时间限制 | 内存限制 | 
|---|---|
1000 ms | 
65536 KB | 
# 题目描述
「James Eugene Raynor」对  scanf  很感兴趣,他似乎发现了格式字符串的作用,但不是很清楚如何从格式字符串获取应该读入什么。请你帮帮他。为了简化题目,本题中仅列出了部分  scanf  格式控制符,你只需要按照本题描述编写程序即可,其他情形不用考虑。
我们每次从格式字符串中读入一个格式控制符,这个格式控制符可能由一个或两个字符组成,详见下方描述。
- 
从格式字符串中读到
\时:- 
如果下一个字符是
\,那么这个控制符\\表示希望从标准输入流中匹配一个\; - 
如果下一个字符是
",那么这个控制符\"表示希望从标准输入流中匹配一个"; - 
如果下一个字符是
n,那么这个控制符\n表示希望从标准输入流中匹配若干个space(空白符); - 
如果下一个字符是
t,那么这个控制符\t表示希望从标准输入流中匹配若干个space(空白符); 
 - 
 - 
从格式字符串中读到
%时:- 
如果下一个字符是
%,那么这个控制符%%表示希望从标准输入流中匹配一个%; - 
如果下一个字符是
d,那么这个控制符%d表示希望从标准输入流中匹配一个int类型; - 
如果下一个字符是
f,那么这个控制符%f表示希望从标准输入流中匹配一个float类型; - 
如果下一个字符是
s,那么这个控制符%s表示希望从标准输入流中匹配一个char[]类型; - 
如果下一个字符是
c,那么这个控制符%c表示希望从标准输入流中匹配一个char类型; 
 - 
 - 
如果读取到的字符是空格,那么表示希望从标准输入流中匹配若干个
space(空白符); - 
如果读取到的字符并不属于这三个,那么这个字符表示希望从标准输入流中匹配该字符本身;
 - 
如果读取到
\或%,但接下来的字符并不属于以上说明的控制符,那么认为格式字符串错误。 
如果格式字符串错误,请 只 输出  FORMAT STRING ERR0R 。否则,对于每一个希望匹配的字符或类型:
- 
如果希望匹配一个类型或特殊字符,请输出该类型名或字符;
 - 
如果希望匹配若干个空白符,请输出一个
space; - 
如果希望匹配一个字符,请输出该字符对应的
ascii码。 
# 输入格式
一个字符串,表示格式字符串,中间可能出现空格。格式字符串末尾无换行。
字符串长度不超过 个字符,且均为可见字符。
# 输出格式
对于每个想读取的类型或字符,请按上述要求输出并换行。
# 输入样例
%d%sA \n%d6\n  | 
# 输出样例
int  | |
char[]  | |
65  | |
space  | |
space  | |
int  | |
54  | |
space  | 
# 样例解释
想要读取的顺序为  int   char[]   A  空格 换行  int  换行, A  的  ascii  码为 , 6  的  ascii  码为 。
# 提示
输出一个字符的  ascii  码可以参考如下代码(代码中  r  为  char  类型,即字符型):
printf("%d", (int)r);  | 
也在此提醒同学们,不建议在格式字符串中添加各种奇奇怪怪的内容,除非你明确清楚你想要程序做什么。如果你只是想读取一个  int  类型,请直接使用
scanf("%d", &n);  | 
即可,不需要也不建议读取空格或换行,否则程序可能不会按你的预期运行。
# 题解:模拟
直接按照题面给出的各种情况模拟即可。
时间复杂度:,其中 代表字符串长度。
参考代码:
#include <stdio.h> | |
#include <string.h> | |
int cnt;  | |
char format[1010], res[1010][10];  | |
int main()  | |
{ | |
    // freopen("E.in", "r", stdin); | |
    // freopen("E.out", "w", stdout); | |
gets(format);  | |
int len = strlen(format);  | |
for (int i = 0; i < len; ++ i)  | |
    { | |
if (format[i] == '\\')  | |
        { | |
if (i + 1 >= len)  | |
            { | |
puts("FORMAT STRING ERR0R");  | |
return 0;  | |
            } | |
if (format[i + 1] == '\\')  | |
sprintf(res[ ++ cnt], "\\\n");  | |
else if (format[i + 1] == '\"')  | |
sprintf(res[ ++ cnt], "\"\n");  | |
else if (format[i + 1] == 'n')  | |
sprintf(res[ ++ cnt], "space\n");  | |
else if (format[i + 1] == 't')  | |
sprintf(res[ ++ cnt], "space\n");  | |
            else | |
            { | |
puts("FORMAT STRING ERR0R");  | |
return 0;  | |
            } | |
++ i;  | |
        } | |
else if (format[i] == '%')  | |
        { | |
if (i + 1 >= len)  | |
            { | |
puts("FORMAT STRING ERR0R");  | |
return 0;  | |
            } | |
if (format[i + 1] == '%')  | |
sprintf(res[ ++ cnt], "%%\n");  | |
else if (format[i + 1] == 'd')  | |
sprintf(res[ ++ cnt], "int\n");  | |
else if (format[i + 1] == 'f')  | |
sprintf(res[ ++ cnt], "float\n");  | |
else if (format[i + 1] == 's')  | |
sprintf(res[ ++ cnt], "char[]\n");  | |
else if (format[i + 1] == 'c')  | |
sprintf(res[ ++ cnt], "char\n");  | |
            else | |
            { | |
puts("FORMAT STRING ERR0R");  | |
return 0;  | |
            } | |
++ i;  | |
        } | |
else if (format[i] == ' ')  | |
sprintf(res[ ++ cnt], "space\n");  | |
        else | |
sprintf(res[ ++ cnt], "%d\n", (int)format[i]);  | |
    } | |
for (int i = 1; i <= cnt; ++ i)  | |
printf("%s", res[i]);  | |
return 0;  | |
} |