时间限制 内存限制
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 码。

# 输入格式

一个字符串,表示格式字符串,中间可能出现空格。格式字符串末尾无换行。

字符串长度不超过 10001000 个字符,且均为可见字符。

# 输出格式

对于每个想读取的类型或字符,请按上述要求输出并换行。

# 输入样例

%d%sA \n%d6\n

# 输出样例

int
char[]
65
space
space
int
54
space

# 样例解释

想要读取的顺序为 int char[] A 空格 换行 int 换行, Aascii 码为 65656ascii 码为 5454

# 提示

输出一个字符的 ascii 码可以参考如下代码(代码中 rchar 类型,即字符型):

printf("%d", (int)r);

也在此提醒同学们,不建议在格式字符串中添加各种奇奇怪怪的内容,除非你明确清楚你想要程序做什么。如果你只是想读取一个 int 类型,请直接使用

scanf("%d", &n);

即可,不需要也不建议读取空格或换行,否则程序可能不会按你的预期运行。

# 题解:模拟

直接按照题面给出的各种情况模拟即可。

时间复杂度:O(L)O(L),其中 LL 代表字符串长度。

参考代码:

#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;
}