时间限制 | 内存限制 |
---|---|
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; | |
} |