TeX中的引号(Tex Quotes, UVa 272)

在TeX中,左双引号是“``”,右双引号是“''”。输入一篇包含双引号的文章,你的任务是 把它转换成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''.

本题的关键有两个:输入字符串和判断左右括号。

1、输入字符串。

  之前学习了使用“scanf("%s")”输入字符串,但却不能在本题中使用它,因为它碰到空格或者TAB就会停下来。虽然下次调用时会输入下一个字符串,可是不知道两次输入的字符串中间有多少个空格、TAB甚至换行符。

  可以用下述两种方法解决这个问题:

  ①使用“fgetc(fin)”,它读取一个打开的文件fin,读取一个字符,然后返回一 个int值。如果文件结束,fgetc将返回一个特殊标记 EOF,这样可以判断是否输入结束。如果要从标准输入读取一个字符,可以用getchar,它等价于fgetc(stdin)。注意:在使用fgetc和getchar时,应该避免写出和操作系统相关的程序。

  ②使用“fgets(buf, maxn, fin)”读取完整的一行,其中buf的声明为char buf[maxn]。这个函数读取不超过maxn-1个字符,然后在末尾添上结束符“\0”,因此不会出现越界的情况。之所以说可以用这个函数读取完整的一行,是因为一旦读到回车符“\n”,读取 工作将会停止,而这个“\n”也会是buf字符串中最后一个有效字符(再往后就是字符串结束 符“\0”了)。只有在一种情况下,buf不会以“\n”结尾:读到文件结束符,并且文件的最后一 个不是以“\n”结尾。即:除了在文件结束前没有遇到“\n”这种特殊情况外,buf总是 以“\n”结尾。当一个字符都没有读到时,fgets返回NULL。

2、判断左右分号。

  用一个标识变量q来判断。

#include<cstdio>
using namespace std;
int main(){
    int c,q=1;
     while((c=getchar()) !=    EOF){
         if(c=='"'){
             printf("%s",q?"``":"''");
             q=!q;
         }
         else printf("%c",c);
     }
    return 0;
}

注意:①(c=getchar()) !=    EOF   ②三目运算符

猜你喜欢

转载自www.cnblogs.com/LOW-ctfer/p/10353060.html