[练习]C 字符数组
C 字符数组
字符数组是C 语言中最常用的数组类型。下面我们通过编写一个程序,来
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
字符数组
以及操作字符数组的
函
关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函
数的用法。该程序读入一组文本行,并把最长的文本行打印出来。该
算法的基本框架非常简单:
while (还有未处理的行)
if (该行比已处理的最长行还要长)
保存该行为最长行
保存该行的长度
打印最长的行
从上面的框架中很容易看出,程序很自然地分成了若干片断,分别用于读入新行、测试读入
的行、保存该行,其余部分则控制这一过程。
因为这种划分方式比较合理,所以可以按照这种方式编写程序。首先,我们编写一个独
立的函数getline,它读取输入的下一行。我们尽量保持该函数在其它场台也有用。至少
getline 函数应该在读到文件末尾时返回一个信号;更为有用的设计是它能够在读入文本行
时返回该行的长度,而在遇到文件结束符时返回0。由于0 不是有效的行长度,因此可以作为
标志文件结束的返回值。每一行至少包括一个字符,只包含换行符的行,其长度为1。
当发现某个新读入的行比以前读入的最长行还要长时,就需要把该行保存起来。也就是
说,我们需要用另一个函数copy把新行复制到一个安全的位置。 最后,我们需要在主函数main中控制getline和copy这两个函数。以下便是我们编
写的程序:
#include
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int maxline); void copy(char to[], char from[]);
/* print the longest input line */
main()
{
int len; /* current line length */
int max; /* maximum length seen so far */ char line[MAXLINE]; /* current input line */ char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0) if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */ printf("%s", longest);
return 0;
}
/* getline: read a line into s, return length */ 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;
}
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
程序的开始对getline和copy这两个函数进行了声明,这里假定它们都存放在同一个
文件中。
main与getline之间通过一对参数及一个返回值进行数据交换。在getline函数中,
两个参数是通过程序行
int getline(char s[], int lim)
声明的,它把第一个参数s 声明为数组,把第二个参数lim 声明为整型,声明中提供数组大
小的目的是留出存储空间。在getline函数中没有必要指明数组s的长度,这是因为该数组
的大小是在main函数中设置的。如同power函数一样,getline函数使用了一个return
语句将值返回给其调用者。上述程序行也声明了getline数的返回值类型为int。由于函数
的默认返回值类型为int,因此这里的int可以省略。 有些函数返回有用的值,而有些函数(如copy)仅用于执行一些动作,并不返回值。copy
函数的返回值类型为void,它显式说明该函数不返回任何值。 getline函数把字符'\0'(即空字符,其值为0)插入到它创建的数组的末尾,以标记
字符串的结束。这一约定已被C语言采用:当在C语言程序中出现类似于
"hello\0"
的字符串常量时,它将以字符数组的形式存储,数组的各元素分别存储字符串的各个字符,
并以'\0'标志字符串的结束。
printf函数中的格式规范%s规定,对应的参数必须是以这种形式
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示的字符串。copy函数
的实现正是依赖于输入参数由'\0'结束这一事实,它将'\0'拷贝到输出参数中。(也就是说,
空字符'\0'不是普通文本的一部分。)
值得一提的是,即使是上述这样很小的程序,在传递参数时也会遇到一些麻烦的设计问
题。例如,当读入的行长度大于允许的最大值时,main 函数应该如何处理,getline 函数
的执行是安全的,无论是否到达换行符字符,当数组满时它将停止读字符。main函数可以通
过测试行的长度以及检查返回的最后一个字符来判定当前行是否太长,然后再根据具体的情
况处理。__________为了简化程序,我们在这里不考虑这个问题。 调用getline 函数的程序无法预先知道输入行的长度,因此getline 函数需要检查是
否溢出。另一方面,调用copy函数的程序知道(也可以找出)字符串的长度,因此该函数不
需要进行错误检查。
练习 1-16 修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入
行的长度,并尽可能多地打印文本。
练习 1-17 编写一个程序,打印长度大于80 个字符的所有输入行。 练习 1-18 编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的
行。
练习 1-19 编写函数 reverse(s),将字符串s 中的字符顺序颠倒过来。使用该函数