<C> getchar()函数 如何把getchar()到的字符串存起来的实际应用

一.getchar()

1.返回值:返回读到的ASCⅡ码值

2.使用方法:

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     char c;
 6     while((c = getchar()) != '\n')
 7     {
 8         printf("%c",c);
 9     }
10 
11     return 0;
12 }

3.功能:从输入缓冲区中读取一个字符 是一个阻塞函数(目前了解就好 后面应该有机会学到这方面的知识)

二.如何把getchar()到的字符串存起来?

1.引入:

我们首先应该思考的问题:“内存申请问题”

我们并不知道所要输入的字符串是多长的 那么我们应该怎么申请这块空间来存这个字符串呢

申请的太大 空间浪费 申请的太小 肯定存不下就是了 这可咋整(突然冒出东北话)

直接定义长度的那种方法就肯定不行了 所以 不妨试试malloc(我觉得ok)

2.假设:现在我要输入1234567890

3.基本思路:

①先申请一个长度为5的空间 把所get到的字符一个一个存进去

当存到倒数第二个空间的时候 而且你还没输完!(警报警报 您的内存已经不够用)

这个时候我们把最后一个空间 存为'\0'

把最后一个空间存为'\0'的目的是:为了让目前所存的这些字符变成一个字符串(你猜我要拿这个字符串干啥 嘻嘻)

②申请一个更大的空间 比如:长度=长度+5

先把之前的字符串拷贝到这个新的字符串里

然后从'\0'的位置继续放get到的字符

以此类推..

4.函数实现:(注释感觉敲重要 你要不要考虑看一下)

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 
 5 char* GetString();
 6 
 7 int main()
 8 {
 9     char* p = GetString();
10     printf("%s\n",p);
11 
12     return 0;
13 }
14 
15 char* GetString()
16 {
17     char c;
18 
19     int nSize = 5;
20     //初始长度
21     int nCount = 0;
22     //用来标记存了多少个字符
23 
24     char* str = (char*)malloc(sizeof(char)*nSize);
25     //创建一个字符数组 初始长度为5
26     char* pMark = str;
27     //让pMark指针始终指在字符数组的首元素的位置
28     char* newStr = NULL;
29 
30     while((c = getchar()) != '\n') //只要没敲回车 存储就一直进行
31     {
32         *str = c;
33         str ++;
34         nCount ++;
35 
36         if(nCount + 1 == nSize) //如果存的元素是内存的倒数第二个空间了
37         {
38             *str = '\0';
39             //让它变成一个字符串
40             nSize += 5;
41             //空间长度变大
42             newStr = (char*)malloc(sizeof(char)*nSize);
43             //申请一个新的空间
44 
45             strcpy_s(newStr,nSize,pMark);
46             //用pMark!!!注意这里一定要用pMark拷贝!!!因为str已经动了 str指的已经不是头了 我打两遍这里都打错了
47 
48             free(pMark);
49             pMark = NULL;
50             //释放就不用我说了吧
51 
52             str = newStr + nCount;
53             //让str指在拷贝过来的字符串'\0'的位置 以便继续存字符
54             pMark = newStr;
55             //重点!!让pMark指在新的字符串头的位置
56         }
57     }
58     //循环往复 直到你敲回车 结束输入
59 
60     *str = '\0';
61     //让它做自己 让它做一个完美的字符数组
62     return pMark;
63 }

敲黑板:在第45行 拷贝老字符串的时候 一定要用pMark拷贝 因为pMark才指向老字符串的头!!!

PS:敲啊敲 敲啊敲 敲好几遍还是会犯错(跟自己生气气) 熟能生巧吧 码的大脖筋疼

posted @ 2018-04-14 19:22  Aaaaaalei  阅读(3400)  评论(0编辑  收藏  举报