首页 > 代码库 > c语言程序设计第一章3

c语言程序设计第一章3

字符数组是C语言中最常用的数组类型。下面我们通过编写一个程序,来说明字符数组以
反操作字符数组的函数的用法。该程序读入一组文本行,并把最长的文水行打印出来。该算
法的基本框架非常简单:
  while (还有未处理的行)
  i f (该行比已处理的最长行还要长)
  保存该行
  保存该行的长度
  打印最长的行

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define MAXLENGTH 100//文本的最大长度
 4 int getline(char line[],int limit);
 5 void copyline(char to[],char from[]);
 6 int main()
 7 {
 8     int length;//当前行的长度
 9     int maxlength=0;//最大行的长度
10     char line[MAXLENGTH];//保存当前行的字符串
11     char longest[MAXLENGTH];//保存最大行的字符串
12     while((length=getline(line,MAXLENGTH))>0)
13     {
14         if(length>maxlength)
15         {
16             maxlength=length;
17             copyline(longest,line);
18         }
19     }
20     if(maxlength>0)
21     {
22         printf("%s",longest);
23     }
24     return 0;
25 }
26 /*getline函数:将输入的字符保存到line数组中,并返回数组长度*/
27 int getline(char line[],int limit)
28 {
29     int c;
30     int i;
31     for(i=0;i<(limit-1)&&(c=getchar())!=EOF&&c!=\n;i++)
32     {
33         line[i]=c;
34     }
35     if(c==\n)
36     {
37         line[i]=c;
38         ++i;
39     }
40     line[i]=\0;
41     return i;
42 }
43 /*copyline函数:经最长字符串保存到to数组中*/
44 void copyline(char to[],char from[])
45 {
46     int i=0;
47     while((to[i]=from[i])!=\0)
48         ++i;
49 }

运行结果:

练习1.16修改打印最长文本行的程序的主程序m a i n,使之可以打印任意长度的输入行的长度,并尽可能多地打印文本。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define MAXLENGTH 15//文本的最大长度
 4 int getline(char line[],int limit);
 5 void copyline(char to[],char from[]);
 6 int main()
 7 {
 8     int length;//当前行的长度
 9     int maxlength=0;//最大行的长度
10     char line[MAXLENGTH];//保存当前行的字符串
11     char longest[MAXLENGTH];//保存最大行的字符串
12     printf("The maxlength of string is 15.\n");
13     while((length=getline(line,MAXLENGTH))>0)
14     {
15         printf("%2d:%s",length,line);
16         if(length>maxlength)
17         {
18             maxlength=length;
19             copyline(longest,line);
20         }
21     }
22     if(maxlength>0)
23     {
24         printf("%s",longest);
25     }
26     return 0;
27 }
28 /*getline函数:将输入的字符保存到line数组中,并返回数组长度*/
29 int getline(char line[],int limit)
30 {
31     int c;
32     int i;//记录输入的字符串长度
33     int j=0;//记录实际可以保存的字符串长度
34     for(i=0;(c=getchar())!=EOF&&c!=\n;i++)
35     {
36         if(i<(limit-2))
37         {
38           line[j]=c;
39           j++;
40         }
41     }
42     if(c==\n)
43     {
44         line[j]=c;
45         ++j;
46         ++i;
47     }
48     line[j]=\0;
49     return i;
50 }
51 /*copyline函数:经最长字符串保存到to数组中*/
52 void copyline(char to[],char from[])
53 {
54     int i=0;
55     while((to[i]=from[i])!=\0)
56         ++i;
57 }

运行结果:

练习1.18编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的行

 1 /*******删除每个输入行末尾的空格及制表符,并删除完全是空格的行****************/
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #define MAXLENGTH 100
 5 int getline(char s[],int limit);
 6 int mydelete(char s[]);
 7 int main()
 8 {
 9     int len;
10     char s[MAXLENGTH];
11     while((len=getline(s,MAXLENGTH))>0)
12     {
13         printf("未删除之前字符数(包含空格):");
14         printf("%d\n",len);
15         if(mydelete(s)>0)
16         {
17             printf("删除之后字符数:");
18             printf("%d",mydelete(s));
19         }
20     }
21     return 0;
22 }
23 int getline(char s[],int limit)
24 {
25     int c;
26     int i;
27     for(i=0;i<(limit-1)&&((c=getchar())!=EOF)&&c!=\n;i++)
28     {
29         s[i]=c;
30     }
31     if(c==\n)
32     {
33         s[i]=c;
34         ++i;
35     }
36     s[i]=\0;
37     return i;
38 }
39 int mydelete(char s[])
40 {
41     int i=0;
42     while(s[i]!=\n)
43         ++i;
44     --i;
45     while(i>=0&&(s[i]== ||s[i]==\t))
46         --i;
47     if(i>=0)
48     {
49         ++i;
50         s[i]=\n;
51         ++i;
52         s[i]=\0;
53     }
54     return i;
55 }

运行结果: