10361 - Automatic Poetry

本文包含以下内容:

一.思路

二.程序

三.总结


一.思路

本题考查的关键是对字符串的读取和输出的问题。

要注意以下几点:

1.如果是用scanf读取一个数字n,其后要用一个getchar读取残存在缓冲区的换行符。

   如果是用cin读取则不必。因为cin会丢弃使其输入停止的\n,而scanf不会

2.接下来是如何读取s1   s2  s3  s4 s5的问题

   对于l1,很显然应该一个字符一个字符的读取。故考虑通过getchar循环读入s1,每次遇到'<'  '>'  '\0'或者'\n'的时候终止循环。并把结尾的字符换成'\0'

   对于l2,  可以通过gets一次性读入。那么如何去除结尾的三个点点呢?  可以通过在倒数第三个的位置放置结束符‘\0’

3.用printf输出就可以了


二.程序(程序转载自博客:http://www.cnblogs.com/Wade-/p/3864742.html)

#include<stdio.h>
#include<string>
#define MAXN 110

int n;
char s1[MAXN], s2[MAXN], s3[MAXN], s4[MAXN], s5[MAXN],line[MAXN];

void getss(char s[]);

int main() {
	FILE *stream;
	freopen_s(&stream, "C:\\Users\\zgwng\\Desktop\\data.txt", "r", stdin);
	scanf_s("%d", &n);
	char c = getchar();
	while (n--) {
		getss(s1);
		getss(s2);
		getss(s3);
		getss(s4);
		getss(s5);

		gets_s(line);
		line[strlen(line)-3]='\0';
	
		printf("%s%s%s%s%s\n", s1, s2, s3, s4, s5);
		printf("%s%s%s%s%s\n", line, s4, s3, s2, s5);
	}


}

void getss(char s[]) {
	for (int i = 0; i < MAXN; i++)
	{
		s[i] = getchar();
		if(s[i] == '<'||s[i]=='>'||s[i]=='\n')
		{
			s[i] = '\0';
			break;
		}
     }
}

三、总结

看似很简单的题,却耗费了很多的时间,还是学到了很多关于输入的知识。

特别是scanf   getchar   gets 它们什么时候会停止读入,是否会抛弃结尾的\n


遇到的最后一个问题是,该程序如果从控制台输入,则运行正确。

但是从我的Data.txt文件读入,输入结果会变成如下所示:


最后一次的输出明显不正确,其前面多了一个点。

逐步调试的时候发现,最后一次执行的gets结果与之前几次不同,结尾会多出现一个\n

用notepad查看我的DATA.txt文件,如下图所示:


发现不同了吗?

不同之处就在于以前每次l2都是以\r\n结尾,而最后一次只有\r,因此最后一次\r被读入了进去

相关知识文章链接:点击打开链接


总之,想要写出简洁优美逻辑清楚的输入输出,还得勤加练习才行。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值