2016-08-22 127 views
0

我正在學習C.所以我寫了這個距離計時器程序。 它使用gnu-gcc編譯器運行良好。 但是,使用gnu-gcc替代avr,它會進行編譯,但是當我運行它時,我只能得到一個cmd會話,除了一旦按任何按鈕就消失。 我想知道爲什麼。我的程序在gnu-gcc上運行良好,但在gnu gcc上沒有avr

我使用的代碼塊,這裏是我的代碼

#include<stdio.h> 
#include<stdlib.h> 
#define speedpersecond 5 

int main() 

{ 

char time [5]; 

double distance; 

printf("Please enter time in seconds"); 

gets(time); 

distance = atoi(time) * speedpersecond; 

printf("Distance is %g ", distance); 

return 8585; 

} 
+2

請勿使用'gets'。你爲什麼要返回'8585'?嘗試返回0 – stackptr

+0

永遠不要以爲只要返回任何數字就會有所作爲。 –

+1

Mmh ...你在哪裏運行你用gcc-avr編譯的程序?在你的PC上還是在微控制器上? – deamentiaemundi

回答

1

您可能正在運行到的原因gets因爲C99標準已經過時,而在C11標準完全消除:緩衝區溢出是辦法簡單。

如果您輸入的字符超過四個字符,則gets將寫出數組的界限,您將有未定義的行爲

改爲使用fgets以安全的方式讀取行。


和關於該returnmain功能。許多系統(包括全部 POSIX系統,如macOS和Linux)使用8位作爲返回值。而且,除零之外的任何東西都被認爲是shell和調用環境的失敗。

您還應該知道atoi函數沒有重大錯誤檢查。無法知道您傳遞的字符串是否包含例如"0"或根本沒有任何數字。在這兩種情況下,它將返回0。幫助您檢測錯誤的更安全的功能是strtol功能。

+0

好吧,那個strtol函數和atoi的用法一樣嗎? –

+0

你能舉個例子嗎? –

+0

@AllanMayers按照鏈接,它導致一個參考,有一個例子。 –

相關問題