<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:敲啊敲 敲啊敲 敲好几遍还是会犯错(跟自己生气气) 熟能生巧吧 码的大脖筋疼