有沒有交代習題?
我怎麼好像沒那個印象...
E1) 以 scanf() 及 printf() 函式, 在螢幕上請使用者輸入一整數,
如 "123", 然後在將其輸入的整數顯示在螢幕上.
# include <stdio.h>
int main()
{
int i;
printf("Please enter an integer:\n");
scanf("%d", &i);
printf("I have just got number %d.\n", i);
return 0;
}
Common Errors)
@ 請宣告為 int main(), 不要用 void main().
@ scanf() 裡頭的 i 要加上 &.
@ scanf("%d", &i); 誤寫為 scanf(&i);
@ 不會宣告 int i;
@ 對稱的運算子, (), <>, "", {} 少了一半.
@ 忘了行尾的分號.
@ return 0; 可以省略.
@ int main() 也可以只寫成 main().
給初學者的建議: 上面幾項先背下來吧.
Advanced Problems)
@ printf() 最好換行.
DOS 的程式可以直接存取輸出入裝置, printf() 可以『所見即所得』.
然而在許多別的作業系統之下, 對於 I/O 有他們自己的哲學.
加上 '\n' 代表的是 carriage return, 相當於結束一個輸出入的動作.
@ 常見的 main() 有四種形式...
int main(void);
int main(int argc, char **argv);
int main(int argc, char **argv, char **env);
void main(void);
只有前兩種是 ANSI C 所允許的.
main() 是使用者看到的第一個函式.
但實際上在 main() 之前還有一段先行碼.
(the C run-time startup code/main()'s caller)
而這段先行碼則是預設 main() 會回傳一個整數.
DOS 接受後兩種 main(), 但其他系統則不見得.
@ scanf() 是 buffered I/O function.
在讀取失敗之後並不會清除原先的緩衝區.
所以說如果打算允許錯誤輸入, 而把程式寫成
while (scanf("%d", &i) < 1)
puts("Not an integer.");
會造成無窮迴圈.
錯誤, 但極可能可行的方法為
fflush(stdin);
實際上 fflush() 只保證能清除檔案的輸出緩衝區, 而不是輸入緩衝區.
然而許多 fflush() 的實作方式可以清除輸入緩衝區.
正確而且具移植性的方法是
fgets(s, sizeof s - 1, stdin);
把輸入緩衝區的資料讀走.
@ 所有未經宣告的 C 函式都具有下列的型別...
extern int function(void);
所以 int main() 的 int 可以忽略.
@ 所有應當 return exp; 卻沒有這個 return statement 的函式.
它的回傳值沒有定義, 不見得是 0.
@ main() 的回傳值是回傳給父行程.
這個回傳值主要是給父行程來判斷程式的執行有沒有出錯.
就慣例上來說, 0 代表程式正常結束.
其他的數值則是代表有某種錯誤發生.
這是 UNIX 慣例, 並不是規範, 但是最好遵守.
--
新詩練習:新鮮。踩破初春裡的狗大便;不經意的滄桑,滿溢著嫩黃的喜悅。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.224.160.129