编写一个程序,一行行的读取输入行,直至到达文件尾。算出每行输入行的长度,然后把最长的那行打印出来

《C和指针》..编程题1-4

题目:编写一个程序,一行行的读取输入行,直至到达文件尾。算出每行输入行的长度,然后把最长的那行打印出来。为了简单起见,可以假定所有的输入行均不超过1000个字符

 

程序设计思路:首先,声明两个数组,temp[MAX]、Len[MAX],它们的作用分别是:temp用来接收从屏幕上输入的字符,Len用来存放所输入的最长的字符数组。

getchar()函数的特点:

1.getchar()函数是从键盘上读入字符,并带回显;

2.输入字符的过程中,getchar()函数一直等待输入'\n',结束读取字符

3.getchar函数的返回值为它读取的字符

4.当输入很多字符(字符数大于两个)时,getchar函数则对输入字符的先后顺序一个个的进行返回,每次返回一个字符,剩余的字符没有丢弃,而是存储在缓冲区中,每次返回一个字符后,将本次返回的字符删除(丢弃),以此类推,一个个的返回输入的字符直至完全返回缓冲区的字符。

5.在windows环境下的gcc(DEV-C++)中,输入Ctrl + z可以得到EOF。在Linux环境下的gcc中,输入Ctrl + d可以得到EOF

关于EOF

计算机术语,缩写通常为EOF(End Of File),在 操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。
在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的 ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~255,不可能出现-1,因此可以用EOF作为文件结束标志。
在 UNIX中, EOF表示能从交互式 shell (终端) 送出 Ctrl+D (习惯性标准)。在微软的 DOS 与 Windows 中能送出 Ctrl+Z。在某些例子处理纯文字档案或从"字元设备"读入资料,微软 MS-DOS 的 shell 或系统程序会加入 ASCII Control-Z 字元到磁碟档案结束处 (尽管基本核心 MSDOS.SYS 档案写入呼叫从未附加 Control-Z)。这是向下相容于一些奇特的 CP/M 功能,从CP/M 档案系统只能就记录的档案长度分配多少 128 位元 "记录"。MS-DOS 档案系统从一开始就能精确的记录档案的位元长度。
由以上描述的getchar函数的特性,所以采取getchar函数作为读取字符的入口,使用while循环可以按行不停的输入每行字符串(getchar函数遇到\n后,暂时结束读取字符,直至把之前读取的所有字符返回才重新开始读取),当输入EOF(在windows环境下的gcc(DEV-C++)中,输入Ctrl + z可以得到EOF。在Linux环境下的gcc中,输入Ctrl + d可以得到EOF)时,while的条件语句为假,则结束行输入。
在while循环内部,将一次行输入的所有字符存放在temp数组中,存储完毕后,把temp数组的字符串长度和Len数组中的字符串长度进行比较,当前者的长度大于后者的长度时,将前者temp中的字符串copy到Len数组中,丢弃之前Len中的字符串,这样Len数组中就一直保存着长度最大的字符串。直到当while循环不再满足循环条件时,将Len中的字符串打印出来。
以上是程序思路的描述,下面是程序
 
#include <stdio.h>
#include <string.h>

#define MAX 1000

int main(void)
{
	unsigned  int i;
	char  ch;
	char temp[MAX],Len[MAX];
	
	/*
	**输入字符,当getchar返回EOF时,结束输入 
	*/
	while( (ch = getchar()) != EOF )
	{
		/*
		**将从屏幕中输入的字符由getchar一个个的返回出来,
		**并存放在数组temp中 
		*/ 
		for( i = 0;ch != '\n';i++ )
		{
			temp[i] = ch;
			ch = getchar();
		}
		
		/*
		**判断字符数组temp和Len的字符长度
		**当temp的长度大于Len的长度时,
		**将temp中的字符copy到Len中,
		**这样保证Len中保存的字符数组的长度最大 
		*/ 
		if( strlen(Len) < strlen(temp) )
		strcpy( Len,temp );
	}
	
	printf("Is the longest string:%s\nlenth:%d\n",Len,strlen(Len));
	
	return 0;
}


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值