一直有個疑問輸入一行數字存入數組時若不知道數字的個數怎么辦,最容易想到的辦法就是接收字符然后轉化為數字,但這樣太過麻煩。
今天上網查了下,說可以用ungetc()函數將字符送回輸入流,在這里總結歸納一下
此外還意外的解決了另外一些以前遇到的問題,也是在調試代碼時發現的,用此段代碼可以用除了空格以外的字符作為分隔符,而且分隔符的長度也可以很長:如輸入12qwertyuiop34asdfghjkl123,23zxc45 最后得到的數組為:a[0]=12,a[1]=34,a[2]=123,a[3]=23,a[4]=45
先貼上代碼:
1 #include<stdio.h> 2 #include<ctype.h> 3 int main() 4 { 5 int a[1000]; 6 char c; 7 int i=0; 8 int n=0; 9 while((c=getchar())!='\n') 10 { 11 if(isdigit(c)) 12 { 13 ungetc(c,stdin);//將c送回輸入流 14 scanf("%d",&a[n++]); 15 } 16 } 17 for(i=0;i<n;i++) 18 { 19 printf("%d ",a[i]); 20 } 21 return 0; 22 }
這里要說明一下,在使用空格作為分隔的時候把14行的scanf函數放到if語句外面可以減少循環次數
但是用其他符號作為分隔符的時候只能放在if語句中,不然會出錯
這里又有另一個問題了,一開始怎么知道數組的長度,定義多少合適呢?
- 如果預先可以估計數組的大小,那么可以比估計的數值定義的稍大一些即可
- 如果無法預知,我的解決辦法就是使用鏈表,但是這樣就無法使用數組的一些特性,比如可能會花很多的時間去尋找某一下標的數據
- 另外我想到的就是犧牲存儲空間的辦法,先用鏈表將數據存起來,並記錄個數。如果后面需要多次利用下標訪問數據的話,可動態分配一塊內存來存儲數據,並將原來的鏈表釋放,或根據需要保留
- 除此之外也沒想到有什么好的方法。。。
