2014-09-20 72 views
1

爲了學術目的,我必須構建自己的atoi()和scanf()函數。構建我自己的scanf函數

第一個很簡單,但我在第二個中遇到了麻煩。

第一招:

int String2Inteiro (char s[]) 
{ 
    int j; 
    int i=0; 
    for(j=0; s[j]!= 0; j++) 
    { 

     i=i*10 + s[j] - '0'; 
    } 

    return i; 
} 

現在,在第二個我有一些問題,我認爲這都涉及到停止條件。 我的第一次嘗試是在Cicle後試圖停止。

char dig; 
int cont=0; 

do 
{ 
    dig=getchar(); 
    array[cont]=dig; 
    cont++; 
} while (dig!= '\n'); 

的第二次嘗試:

int counter=0; 
char a; 
char array[20]; 

while (a!='\n') 
{ 
    a=getchar(); 
    vec[counter]=a; 
    counter=counter+1; 
} 

我不知道如果進入得到很好的體現,或者我應該有使用「\ 13」(CR ASCII碼)。

由於提前,

安德烈

+1

你測試在將數據添加到數組後是否已達到停止字符。 – Barmar 2014-09-20 20:05:05

+1

是的,'\ n''是正確的。但是這應該實現哪個轉換說明符? – mafso 2014-09-20 20:05:28

+0

作爲一個說明,不可能以嚴格符合的方式實現'scanf'(不使用任何'* scanf'系列函數)。無法獲得其推回行爲(但是,「ungetc」應該用於練習目的)。 – mafso 2014-09-20 20:07:27

回答

1

你應該將它添加到陣列中後不盡快你讀了終止符跳出循環:

while (counter < sizeof(array)) { // Prevent buffer overflow 
    a = getchar(); 
    if (a == '\n') { 
     array[counter] = 0; // Add trailing null to input string 
     break; 
    } 
    array[counter] = a; 
    counter++; 
} 
+0

它確實是我想要的。雖然,當我超過sizeof(數組)時,我期待while循環終止。 – andrescpacheco 2014-09-21 17:10:08

+0

爲什麼你期望它沒有明確檢查就終止?除非你告訴他們電腦,否則電腦不會做任何事情。 – Barmar 2014-09-21 17:18:42