1.8-1.9字符数组

这里书上对于参数的讲解比较少,大家可以仔细阅读,注意其中的一些概念,也可以看上一章对于例子中参数的讲解,本章不再讲述。

我们直接看字符数组:

要求编写一个程序将文本中最长的行打印出来,给了以下框架:

while(还有未处理的行)
if(该行比已处理的行还要长)
    保存该行
    保存该行的长度
打印最长的行

分析一下就是,将一个文本的每一行都进行判断,找出其中最长的行,保存起来,最后打印出来

直接看程序:

#include<stdio.h>
#define MAXLINE 1000//定义宏

int getline(char line[], int maxline);//函数声明
void copy(char to[], char from[]);//函数声明
int main(void) {
	int len;
	int max;
	char line[MAXLINE];
	char longest[MAXLINE];

	max = 0;
	while((len=getline(line, MAXLINE))>0)
		if (len > max) {
			max = len;
			copy(longest, line);
		}
	if (max > 0)
		
		printf("%s", longest);
	return 0;
 }
//该函数将文本的一行读入s数组中并返回其长度
int getline(char s[], int lim) {
	int c, i;
	for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
		s[i] = c;
	if (c == '\n') {
		s[i] = c;
		++i;
	}
	s[i] = '\0';
	return i;
}
//该函数将from数组复制到to数组中,在主函数中就是将目前判断出来的最长的行保存下来
void copy(char to[], char from[]) {
	int i;
	i = 0;
	while ((to[i] = from[i]) != '\0')
		++i;
}

我们随便打几行然后 ctrl z 输出,结果如下:

 很明显,这里将最长的行打印了出来。

这个程序思路比较明显,首先定义两个字符数组:char line[MAXLINE]  char longest[MAXLINE],第一个用来接受当前输入的行。引用函数:getline(line, MAXLINE),在函数int getline(char s[], int lim)中进行操作,line就是s[]的实参,MAXLINE是lim的实参,在函数中利用for循坏输入这一行的内容,打到最后,将'\0'给数组最后一位,表明这一行结束。最后返回i,也就是这一行的长度。

引用完函数后,再进行判断if (len > max),第一次判断,由于max初始是0,所以一定是len>max,然后把len赋值给max,之后跟第二行比较,以此类推,每一行都要跟目前最长的进行比较,如果比目前最长的还长,就用新的去替换。

copy(longest, line)下面这个函数引用目的在于将这个目前最长的的行的数组复制到另一个数组里,也就是取出这一行。

最后,等每一行都比较完,最长的行也就确定了,可以放心的打出这一行了。

我们要注意字符数组的构成,先来看这个例子:

#include<stdio.h>
int main(void) {
	char a[6] = "hello";
	printf("%s", a);
return 0;
}

结果是:

#include<stdio.h>
int main(void) {
	char a[5] = "hello";
	printf("%s", a);
return 0;
}

 如果把6改成5,结果是:

 这样是溢出了

这是因为字符数组最后有个'\0'要占一个位置,所以元素是6个而不是5个,也就是说,他的存储格式是这样的:

hello\0

'\0'并不是字符串的一部分,但是这个字符串的结束要靠这个'\0',你总要要给它留个位置。

当然,书中最后还解释了可能出现的问题,不过,我们目前的水平......还涉及不到这样的情况,在此不再讲解。

好,今天先写这些,如有疏漏,还请指正。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值