编写一个程序,从标准输入一行一行地读取文本,并完成如下任务:如果文件中有两行或更多行相邻的文本内容相同,那么就打印出其中一行,其余的行不打印。你可以假设文件中的文本行在长度上不会超过128个字符(127个字符加上用于终结文本行的换行符)。
提示:使用gets函数读取输入行,使用strcpy函数来复制它们。有一个叫做strcmp的函数接受两个字符串参数并对它们进行比较。如果两者相等,函数返回0,如果不等,函数返回非零值。
自己的思路
看到这题首先想的是把每行输入都赋值到一个数组里,然后再一行一行进行比较两行相同或多行相同就输出一行。
- 定义数组用来接收用户输入的每行内容,可能对数组理解不够深,发现对定义一个空数组都有点懵(真菜)
- 然后就是处理用户输入,用这个循环while((ch=getchar())!=EOF),赋值给数组换行操作就加上if(ch='n')判断进行处理
- 再用strcmp()进行判断处理,根据题目提示是用gets()获取用户输入,就发现自己的肯定有问题,还有使用strcpy函数来复制它们
看完大佬文章后的我
首先写好我们要用到的标准库和宏定义常量(方便程序的修改)
#include#include #include #define row 20 //定义一个常量行 #define list 128 //定义一个最大列
这里用到了
接下来就是主函数了
int main()
{
char enter[row][list]={0}; //定义一个二维数组
char output[row]; //定义一个输出数组来接收要打印的行
int i=0; //定义数组下标
printf("请输入:n"); //程序服务于人
while(gets(enter[i])!=NULL)
{
i++;
}
repeat(enter,output,i); //这里用一个函数对用户输入的文本进行处理
return EXIT_SUCCESS;
}
- 一开始定义数组就把我难住了,后面看了大佬的文章才发现可以这样定义一个空数组,这里必须用到二维数组,因为处理的文本有行有列,不然后面无法实现。
- 核心点就在这个while(gets(enter[i])!=NULL)我之前学习的处理输入行的方法都是while((ch=getchar())!=EOF)这个EOF可以表示一种异常的状态,即输入的内容不正常,列如输入ctrl+z即可退出循环,前者是gets后者是getchar,这里就不详细讲这两个,有兴趣的可以自己去查资料研究,前者的NULL表示空,这里不能换成EOF,但是结束循环也可以用ctrl+z。学到了一种新的处理输入行的方法,而且这种方法确实牛逼,不愧是大佬,三行就解决了我想半天都不会的难题。
- 接下来就用函数来对输入的文本进行处理吧,让代码更清晰点。
char repeat(char enter[row][list],char output[row],int i)
{
int flag=0;
while(flag<=i)
{
if(strcmp(enter[flag],enter[flag+1])==0)
{
strcpy(output,enter[flag]);
if(strcmp(enter[flag],enter[flag+2])!=0)
{
printf("重复行:%sn",output);
}
}
flag++;
}
}
这里应该不需要解释什么了,比较简单,一个循环两个判断,不得不说大佬思路就是牛逼,虽然用简单代码可以写出,但我没有这个思路结果就没写出来。
这里我们注意要把函数写在主函数main上面,因为程序是从上往下读,如果写在下面会报错说函数没有声明,或者第二种办法是在上面定义常量的地方加上函数的声明,列如我这函数的声明可以这样写:
#include#include #include #define row 20 //定义一个常量行 #define list 128 //定义一个最大列 char repeat(char enter[row][list],char output[row],int i);
我们再学习一下大佬的思路:
直接用while(gets(enter[i])!=NULL) { i++; }来获取用户所有的输入,直到用户不再输入,就好比成了一个文件,然后在用一个函数来处理这个文件,两个数组一个储存用户输入的这个文件,再两个判断一个比较两行是否相同,另一个就处理多行(我当时还真不知道怎么处理多行判断,这个判断第三行,我直呼好家伙,我太笨了),最后一个数组用来复制重复行并进行输出。
完整代码:
#include#include #define row 20 //定义一个常量行 #define list 128 //定义一个最大列 char repeat(char enter[row][list],char output[row],int i) { int flag=0; while(flag<=i) { if(strcmp(enter[flag],enter[flag+1])==0) { strcpy(output,enter[flag]); if(strcmp(enter[flag],enter[flag+2])!=0) { printf("重复行:%sn",output); } } flag++; } } int main() { char enter[row][list]={0}; //定义一个二维数组 char output[row]; //定义一个输出数组来接收要打印的行 int i=0; //定义数组下标 printf("请输入:n"); //程序服务于人 while(gets(enter[i])!=NULL) { i++; } repeat(enter,output,i); //这里用一个函数对用户输入的文本进行处理 return EXIT_SUCCESS; }
运行效果:
最后总结一下:
- 因为平常没有c这门课,所有是自己太懒,代码敲少了,光看书不练。
- 还有就是平常多看大佬们的代码,学习他们的思路。
- 本来不怎么写博客,而且博客也写的很烂,但是今天看到一位写的很好的博主,激励了一下我,让我想向她学习,下面是她的博客链接https://blog.csdn.net/qq_53656490
- 不仅是因为上面这位博主写的好,还有最重要的原因是因为我发现写博客是一种享受,因为检测自己有没有学会最好的办法就是教会别人,在写博客的过程中,你会发现你要讲细来,很多细节你是要弄明白的,不然你教不会别人,这就要求你把这题要理解很深,这篇博客是我写的最认真的第一篇,花了几个小时。但我觉得很充足,可能这篇博客写的不是很好,但慢慢进步。后面也会多写,来要求自己好好学习,尽量教会别人更多内容。
- 还有一件特别重要的事就是昨天我过生日,EDG夺冠了,每一场比赛我都看完了,6号的比赛打到最后一场bo5刚好是7号,大声喊一句EDG牛逼!!!
- 联盟动画也和我出生在了同一天



