1.8-1.9字符数组

这里书上对于参数的讲解比较少,大家可以仔细阅读,注意其中的一些概念,也可以看上一章对于例子中参数的讲解,本章不再讲述 。
我们直接看字符数组:
要求编写一个程序将文本中最长的行打印出来,给了以下框架:
while(还有未处理的行)if(该行比已处理的行还要长)保存该行保存该行的长度打印最长的行
分析一下就是,将一个文本的每一行都进行判断,找出其中最长的行,保存起来,最后打印出来 。
直接看程序:
#include#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[]char [],第一个用来接受当前输入的行 。引用函数:(line, ),在函数int (char s[], int lim)中进行操作,line就是s[]的实参,是lim的实参,在函数中利用for循坏输入这一行的内容,打到最后,将'\0'给数组最后一位,表明这一行结束 。最后返回i,也就是这一行的长度 。
引用完函数后,再进行判断if (len > max),第一次判断,由于max初始是0,所以一定是len>max,然后把len赋值给max,之后跟第二行比较,以此类推,每一行都要跟目前最长的进行比较,如果比目前最长的还长,就用新的去替换 。
copy(, line)下面这个函数引用目的在于将这个目前最长的的行的数组复制到另一个数组里,也就是取出这一行 。
最后,等每一行都比较完,最长的行也就确定了,可以放心的打出这一行了 。
我们要注意字符数组的构成,先来看这个例子:
#includeint main(void) {char a[6] = "hello";printf("%s", a);return 0;}
结果是:

1.8-1.9字符数组

文章插图
#includeint main(void) {char a[5] = "hello";printf("%s", a);return 0;}
如果把6改成5,结果是:
这样是溢出了
这是因为字符数组最后有个'\0'要占一个位置,所以元素是6个而不是5个,也就是说,他的存储格式是这样的:
\0
'\0'并不是字符串的一部分,但是这个字符串的结束要靠这个'\0',你总要要给它留个位置 。
当然,书中最后还解释了可能出现的问题,不过,我们目前的水平......还涉及不到这样的情况,在此不再讲解 。
【1.8-1.9字符数组】好,今天先写这些,如有疏漏,还请指正 。