题意:
在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''
AC代码:
#include<iostream>
using namespace std;
int main() {
char c;
int q = 1;
while ((c = getchar()) != EOF) {
if (c == '"') {
string ans = q ? "``" : "''";
q = !q;
cout << ans;
}
else cout << c;
}
return 0;
}
拓展知识:
之前学习了使用“scanf("%s")”输入字符串,但却不能在本题中使用它,因为它碰到空格 或者TAB就会停下来。虽然下次调用时会输入下一个字符串,可是不知道两次输入的字符串 中间有多少个空格、TAB甚至换行符。可以用下述两种方法解决这个问题:
第一种方法是使用“fgetc(fin)”,它读取一个打开的文件fin,读取一个字符,然后返回一 个int值。为什么返回的是int而不是char呢?因为如果文件结束,fgetc将返回一个特殊标记 EOF,它并不是一个char。如果把fgetc(fin)的返回值强制转换为char,将无法把特殊的EOF和 普通字符区分开。
如果要从标准输入读取一个字符,可以用getchar(),它等价于fgetc(stdin)。
提示:使用fgetc(fin)可以从打开的文件fin中读取一个字符。一般情况下应当在检 查它不是EOF后再将其转换成char值。从标准输入读取一个字符可以用getchar,它等价于 fgetc(stdin)。 fgetc和getchar将读取“下一个字符”,因此需要知道在各种情况下,“下一个字符”是哪 个。
如果用“scanf("%d", &n)”读取整数n,则要是在输入123后多加了一个空格,用getchar读 取的将是这个空格;如果在“123”之后紧跟着换行,则读取到的将是回车符“\n”。 这里有个潜在的陷阱:不同操作系统的回车换行符是不一致的。Windows是“\r”和“\n”两 个字符,Linux是“\n”,而MacOS是“\r”。如果在Windows下读取Windows文件,fgetc和getchar 会把“\r""吃掉”,只剩下“\n”;但如果要在Linux下读取同样一个文件,它们会忠实地先读 取“\r”,然后才是“\n”。如果编程时不注意,所写程序可能会在某个操作系统上是完美的,但 在另一个操作系统上就错得一塌糊涂。当然,比赛的组织方应该避免在Linux下使用Windows 格式的文件,但正如前面所强调过的:选手也应该把自己的程序写得更鲁棒,即容错性更好。