本题解决的问题是读取整段的文本,判断其中的双引号是左双引号还是右双引号。此题目不能够使用 scanf("%s") ,因为可能会忽略有意义的空格、缩进或换行。
第一种方法是使用 fgetc(fin) ,返回值为int类型,因为当文件结束时会返回一个特殊标记EOF,它并不是一个char。如果从标准输入输出读取一个字符,可以用 getchar() ,等价于 fgetc(stdin) 。
不同操作系统的回车换行符不同,Windows是"\r\n",Linux是"\n",MacOS是"\r"。
第二种方法是使用 fgets(buf, maxn, fin) 读取完整的一行,其中buf的声明为char类型的 buf[maxn] ,这个函数能够读取不超过maxn-1个字符,然后在末尾填上结束符"\0",这个函数读取一行是因为当读取到回车符"\n"时,读取就会停止,只有当文件结束且最后一个字符不是换行符,读取到文件结束符就会停止,buf将不会以"\n"结尾。
应当保证buf足够存放下文件的一行内容,当一个字符都没有读到时,fgets 返回 NULL。
C语言不禁止程序读写“非法内存”,gets(s) 存在问题,由于没有指明读取的最大字符数,s会出现溢出问题,C11已正式删除。
[1]刘汝佳,《算法竞赛入门经典(第2版)》
→back
Contact me
Please contact me about any suggestion(s): aliceb0b@hotmail.com.