自定義輸入函式與不浪費空間儲存字串
阿新 • • 發佈:2021-02-05
很多時候我們要輸入一個名字,但是名字之間有空格,如果用scanf就遇到空格就會預設為輸入結束,這個時候我們就需要自己寫一個輸入函式。
先把程式碼給出來
直接用scanf接收:
#include<stdio.h>
int main(){
char n[20]={}; //定義一個字元陣列接受 名字
scanf("%s",n);
printf("%s",n);
return 0;
}
scanf結果如下:
image.png#include<stdio.h> int main(){ char n[20]={}; //定義一個字元陣列接受 名字 int i =0; //定義一個索引值,記錄當前是第幾個 while(1){ char c =getchar(); if(c == '\n'){ n[i] = '\0'; //如果遇到回車就輸入 \0 等會可以整體輸出。 break; } n[i] = c; //如果沒有碰到回車就把接收到的字元寫入陣列。 i++; //索引值++ } printf("%s",n); }
執行結果如下:
image.png函式講解:其實這個函式的實現很簡單,就是用getchar()一個一個的接受,判斷這個字元是不是回車,如果不是就將它儲存下來。如果是回車就結束輸入,跳出迴圈。
是不是看著就很簡單,沒有幾行程式碼?事實也確實是這樣,那麼試著自己寫一寫吧。
那我們如何才能不浪費空間的儲存字串呢?
通常我們儲存字串使用字元陣列,但是這樣有個問題:這個字串的長度是多少?不可能每次輸入的字串都是一樣長吧!
我們來看下面的這個程式碼:
char name[100] = {}; scanf("%S",name); printf("%s",name)
對於這個程式碼,我相信很多人都不陌生,應該都寫過的,很簡單的一個程式碼
那下面我們來看看這個程式碼有哪些不足:
- 字元陣列的長度是固定的,很死板,也很侷限。
- 輸入使用scanf,導致字串中間不能輸入空格,同樣很侷限。
那下面我們來看看這個程式碼:
//使用malloc分配記憶體 //使記憶體不浪費 #include<stdio.h> #include<stdlib.h> int main(){ char *name = NULL; //宣告一個指標 int i= 0; //定義一個索引值 while(1){ //輸入字串 char c = getchar(); // 每次都錄入一個字元 if(c=='\n'){ break; //如果是回車,就退出迴圈 } if(i==0){ //如果是第一個字元就分配一個記憶體來儲存這個字元 name = (char *)malloc(1*sizeof(char)); if(name==NULL){ exit(EXIT_FAILURE); } name[0] = c; } else { //實現記憶體的不浪費,輸入多少的就分配多少的空間 name = (char *)realloc(name,(i+1)*sizeof(char)); //如果不是第一個字元就每次錄入的時候在分配一個位元組記憶體空間來裝入這個字元 name[i] = c; } i++; } printf("%s",name); free(name); return 0; }
我們簡要的來分析一下這個程式碼:
- 這個程式碼相對更加靈活,定義的指標來儲存字串,沒有限定大小。
- 使用我們上面見過的自定義輸入,解決了scanf不能輸入遇到空格不能輸入的問題。