本文包含以下内容:
一.思路
二.程序
三.总结
一.思路
本题考查的关键是对字符串的读取和输出的问题。
要注意以下几点:
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被读入了进去
相关知识文章链接:点击打开链接
总之,想要写出简洁优美逻辑清楚的输入输出,还得勤加练习才行。