4.2.1 使用字符串作为存储结构

一般字符串以数组存储表示。因此一个字符串可以通过声明一个定长字符数组实现,也可以通过声明一个不定长字符数组实现。C++提供了许多字符串处理的库函数,利用这些库函数可简化字符串的运算。

【4.2.1.1 TEX Quotes】

TEX是Donald Knuth开发的一种排版语言,它将源文本与一些排版指令结合,产生一个我们所希望的优美的文档。这些优美的文档使用左双引号和右双引号来划定引用句,而不是用大多数键盘所提供的一般的"。通常键盘没有定向的双引号,但有左单引号(`)和右单引号(')。请检查你的键盘找到左单引号(`)键(有时也被称为“反引号键”)和右单引号(')键(有时也被称为“撇号”或称为“引号”)。注意不要混淆左单引号(`)与反斜杠键(/)。TEX让用户键入两个左单引号(``)以产生一个左双引号,两个右单引号(")以产生一个右双引号。然而,大多数打字员习惯于用无定向的双引号(")来划定引用句。

如果原文包含"To be or not to be,"quoth the bard,"that is the question.",那么TEX产生的排版文档不包含所要求的形式:"To be or not to be,"quoth the bard,"that is the question."。为了产生所要求的形式,原文要包含这样的句子:``To be or not to be,"quoth the bard,``that is the question."。

请编写一个程序,将包含双引号(")字符的原文的文字转换成相同文字,但双引号被转换为TEX所要求的划定引用句的两字符有方向的双引号。如果是开始一段引用句,双引号(")字符被``代替,如果是结束一段引用句,双引号(")字符被"代替。注意嵌套引用的情况没有出现:第一个"一定被``替代,下一个被"替代,再下一个被``替代,再下一个被"替代,再下一个被``替代,再下一个被"替代,依次类推。

输入

输入由若干行包含偶数个双引号(")字符的文本组成。输入由EOF字符结束。

输出

除下述情况之外,输出的文本要和输入的一样:每对双引号中的第一个"被替换为两个`字符,并且,每对双引号中的第二个"被替换为两个'字符。

试题来源:ACM East Central North America 1994

在线测试:POJ 1488,UVA 272

试题解析

由于每对双引号的替换形式是交替出现的(第一个"被替换为两个`字符,第二个"被替换为两个'字符),因此设常量p[0]为第一个"的替换形式``,p[1]为第二个"的替换形式"。

初始时,从第一个"的替换形式出发(k=0),逐个字符地扫描字符串。若当前字符非双引号,则原样输出;否则用p[k]替换之,然后取另一种替换形式(k=!k)。

参考程序


#include <cstdio>                     //预编译命令
#include <cstring>
const char p[][5] = {"''", """ };     //p[0]为两个'字符,p[1]为两个'字符
int main(void)
{
    int k = 0;                        //第一个 " 被替换为两个'字符
    char c;
    while ((c = getchar()) != EOF) {  //反复读字符c,直至输入结束
        if (c == '"') {               //若当前字符是双引号,则被替换成p[k],下一次双引
                                      //号取另一替换形式;若当前字符非双引号,则原样输出
            printf("%s", p[k]);
            k = !k;
        } else
                putchar(c);
    }
    return 0;
}