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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM