一.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:敲啊敲 敲啊敲 敲好幾遍還是會犯錯(跟自己生氣氣) 熟能生巧吧 碼的大脖筋疼
