8、获取输入的字符串并输出最长的那个


 1 #include <stdio.h>
 2 
 3 #define maxlength 1000                  //设定一个最大长度值1000
 4 
 5 int getline(char line[], int length);   //定义一个获取输入字符串的函数,包含一个数组和一个长度值
 6 void copyline(char from[], char to[]);  //定义一个拷贝字符串的函数,包含一个被拷贝数组和一个新的数组
 7 
 8 int main()
 9 {
10     int len;                 //定义当前输入字符串的长度值
11     int maxlen;              //定义已输入的字符串的最大长度值
12     char line[maxlength];    //定义一个数组,长度为设定的最大长度1000,用来存放当前输入的字符串
13     char longest[maxlength]; //定义一个数组,长度也是设定的最大长度,用来存放被筛选出来的最长字符串
14 
15     maxlen = 0;              //默认最开始时的最大字符串长度为0
16 
17     while ((len=getline(line, maxlength)) >0) //getline()函数的返回值就是当前输入字符串的长度,把这
18            {                                  //个值赋给len,如果len大于0,即当前有输入内容,则进入
19                if (len > maxlen)              //循环,如果当前输入长度大于已经保存的最大长度,那么
20                {                              //更新这个最大的值此时也就是说发现了新的最长字符串,
21                    maxlen = len;              //用copyline()函数将这个新查到的字符串数拷贝到
22                    copyline(line, longest);   //longest数组中去
23                }
24            }
25     if (len == 0)                                    //程序进行到这里说明当前输入的长度不满足>0的
26         printf("输入的最长内容是:%s\n", longest);   //条件,就是说没有输入此时认为输入已完成,把
27                                                      //保存的最长字符串数组输出显示出来
28     return 0;
29 }
30 
31 int getline(char line[], int length)              //输入字符串获取、保存函数
32 {
33     int i;      //循环计数用,同时也作为长度计数
34     int c;      //输入字符
35 
36     i = 0;
37 
38     for (i=0; i<length-1 && (c=getchar())!=EOF && c!='\n'; ++i) //当输入字符不是空格,也不是结束符EOF
39         line[i] = c;                                            //,说明输入的是正常字符,需要进行保存
40     if (c == '\n')    //如果输入的是换行符,说明一个字符串输入完成,此时把这个换行符保存到数组中,并把长度
41     {                 //计数+1,这里+1是为了区分输入的是EOF还是换行,如果一开始就直接点击换行,这时候i是1
42         line[i] = c;  //如果直接是结束符E0F,i就是0,i是1的时候,有可能接下来还需要继续进行输入,但是如果
43         ++i;          //i=0,则说明输入过程结束,下边需要开始筛选输出最长的字符串数组了
44     }
45     return i;
46 }
47 
48 void copyline(char from[], char to[])             //字符串数组拷贝函数
49 {
50     int i;    //循环计数用
51 
52     for (i=0; from[i]!='\n'; ++i)   //从0开始,把原字符串数组的值一个一个对应拷贝到另外一个数组中,直
53     {                               //到在原数组中遇到换行符,说明原数组就这么长,后边不需要拷贝了
54         to[i] = from[i];
55     }
56     to[i] = from[i];
57 }

在尝试写的过程中遇到很多问题,中间顶着书上的代码前前后前琢磨了很长时间,输入获取保存和拷贝都好理解,但是在主函数比较输出的判断逻辑那里最开始绕到了死循环里边已知搞不懂

1、什么时候算输入结束,需要进行输出结果呢?以什么为标志来判断?

最开始以为是换行符,不过一想不对,输入一行完成后进行另外一行,肯定需要输入换行符的。如果以换行符为标志,最后肯定只能输一行,然后enter就出结果了,程序执行只能输入一行,第二行都输入不了那还怎么比较!

2、主程序内的循环是在不停的把新数组和最长数组进行比较和更新,结果就是要么发现了更长输入内容需要更新一下数组,要么没有发现更长的那就最长数组不变,在这两种情况下什么时候循环终止呢?好像没有尽头啊...

最后发现是在逻辑上跑偏了,两个数组进行对比的前提是:我输入了一个有效的字符串!

如果程序扫描到一个无效的输入信息,那么也就是说我停止了输入有效字符串,即输入完成,需要开始进行对运算输出结果了!

所以主程序的循环过程就变成了:如果输入内容有效,则开始进行比较和筛选更新,如果输入内容无效,则输入过程结束,输出结果

 

最后选择了用文件结束符EOF来进行区分,因为这个原因,同时也就需要把换行符计入到输入长度中去用来和EOF进行辨别,否则的话EOF结束时和正常输入ENTER换行时,当前输入内容的长度都会是0(getline()=0),就

无法再根据getline()函数返回的信息来确定是否输入结束了。 PS:windows系统内文件结束符EOF的输入是ctrl+z,EOF本身的值之前有测试过,是-1

 

另外,有一个奇怪的地方时,在最后输出的地方,单独用%s的话输出是正常的,但是如果加上换行,用%s\n的话,在输出的后边就会出来一个乱码符号(不固定,会变),不知道什么原因,希望大佬看到的话

可以帮忙指点一下

 

posted @ 2017-11-03 22:52  Goz  阅读(1386)  评论(0编辑  收藏  举报