栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言 打印出文本两行或多行相邻内容相同的一行

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言 打印出文本两行或多行相邻内容相同的一行

记录下今天向大佬文章学习的内容,首先看到下面的题目:

编写一个程序,从标准输入一行一行地读取文本,并完成如下任务:如果文件中有两行或更多行相邻的文本内容相同,那么就打印出其中一行,其余的行不打印。你可以假设文件中的文本行在长度上不会超过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  //定义一个最大列

这里用到了这个标准库,主要用到库宏EXIT_FAILURE ,EXIT_SUCCESS作用就是作为返回,失败和成功,看很多大佬都用就学着用。就不用说了,处理字符串。


接下来就是主函数了

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牛逼!!!
  • 联盟动画也和我出生在了同一天
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/456791.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号