读《C程序设计语言》笔记2

学习字符数组的笔记:

1 /***************
2 description:
3 读入一组文本行,并把最长的文本行打印出来。
4 ***************/
5 #include <stdio.h>
6
7  #define MAXLINE 1000
8  int getline(char line[], int maxline);
9 void copy(char to[], char from[]);
10 int main()
11 {
12 int len; //当前行长度
13 int max; //目前为止发现的最长行的长度
14 char line[MAXLINE]; //当前的输入行
15 char longest[MAXLINE]; //用于保存最长的行
16
17 max=0;
18 while((len=getline(line,MAXLINE))>0)
19 {
20 if(len>max)
21 {
22 max=len;
23 copy(longest, line);
24 }
25 if(max>0)
26 printf("%s", longest);
27 system("pause");
28 }
29 }
30 //getline函数:将一行读入到s中并返回其长度
31 int getline(char s[], int lim)
32 {
33 int c,i;
34 for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
35 s[i]=c;
36 if(c == '\n')
37 {
38 s[i]=c;
39 ++i;
40 }
41 s[i]='\0';
42 return i;
43 }
44 //copy函数:将from复制到to;这里假定to足够大
45 void copy(char to[], char from[])
46 {
47 int i;
48 i=0;
49 while((to[i]=from[i])!='\0')
50 ++i;
51 }

  这个程序本身很小,也很简单,但是有两个知识点我想在这里记录下:

  (1)上述程序行也声明了getline函数的返回值类型为int。

     由于函数的默认返回类型为int,因此这里的int可以省略。

  (2)getline函数把字符'\0'(即空字符,其值为0)插入到它创建的数组的末尾,以标记字符串的结束。这一约定已被C语言采用:

     当在C中出现类似于:"hello\n"

     的字符串常量时,它将以字符数组的形式存储,数组的各元素分别存储字符串的各个字符,并以'\0'标志字符串的结束。

    printf函数中的格式规范%s规定,对应的参数必须是以这种形式表示的字符串。

  理解清楚字符数组,才能在C语言大胆的使用字符串常量。

  练习1-19:编写函数reverse(s),将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序。

  写了一个基本实现要求的程序,发现如此的烂,郁闷,过后再该之~

1 #include <stdio.h>
2
3 #define MAXLINE 1000
4 int getline(char line[], int maxline);
5 void reverse(char line[], int length);
6 int main()
7 {
8 int len; //字符串长度(字符数组长度)
9 char line[MAXLINE]; //当前的输入行
10 len=getline(line,MAXLINE);
11 reverse(line,len);
12 printf("%s\n", line);
13 system("pause");
14 }
15 //getline函数:将一行读入到s中并返回其长度
16 int getline(char s[], int lim)
17 {
18 int c,i;
19 for(i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
20 s[i]=c;
21 if(c == '\n')
22 {
23 s[i]=c;
24 ++i;
25 }
26 s[i]='\0';
27 return i;
28 }
29 //reverse函数:把字符串中的字符顺序颠倒过来
30 void reverse(char line[], int length)
31 {
32 int i,j;
33 for(i=0,j=length-1; i<j; ++i,--j)
34 {
35 int temp=line[i];
36 line[i]=line[j];
37 line[j]=temp;
38 }
39 //printf("%s",line);
40 }

结果还不满意,其实获取字符串长度,完全可以用C函数库中的字符串函数:strlen,后面还有详细的数组学习

7-11补充修改:

  通过这个程序的学习,使我对C语言中的字符数组有了更深刻的了解,其实是第一遍学C的时候,谭那本书,没好好学。

  对翻转字符的函数重新写了下:

1 //reverse函数:把字符串中的字符顺序颠倒
2 void reverse(char line[])
3 {
4 int i,j;
5 char temp;
6 i=0;
7 while(line[i]!='\0')
8 ++i;
9 --i; //去除'\0'
10 if(line[i]=='\n')
11 --i; //去除'\n'
12 j=i;
13 for(i=0; i<j; ++i,--j)
14 {
15 temp=line[i];
16 line[i]=line[j];
17 line[j]=temp;
18 }
19 }

 修改函数后运行效果如下:

  reverse函数先要找到字符串s的末尾,然后从'\0'倒退一个位置,这样可以保证颠倒后得到的字符串的第一个字符不会成为一个字符串结束符。如果从'\0'倒退一个位置后遇到的是一个换行符'\n',那就再倒退一个位置,因为换行符也像'\0'一样必须出现在行的末尾。

  这下可以了。结束本次笔记

原文地址:https://www.cnblogs.com/wangzhiyu811/p/2102514.html