選單功能表製做
2008年9月8日 星期一 by Anati
在寫某一個具有多個功能的程式,我想一個良好的使用者介面會讓使用者使用上更加的方便,使用者喜歡用選項來選擇他想要達到的目的,因此介紹一個程式小小的技巧來解決這樣的問題。
※ 單一字元讀取問題
為了一次取得使用者輸入的一個字我們需要使用到getchar()但是這個函式往往讓初學者一直遇到相同的問題,就是它會將'\n'的換行字元留在stdin之中,讓你下一次取得字元的時候自動讀入很麻煩,所以我們要想一個辦法清空stdin讓換行字元被刪除。
Example:
void clearstdin()
{
while (getchar() != '\n');
}
它會讓stdin中所有的字元不斷的被getchar()出來,直遇到'\n'換行字元,而且會連換行字元都被抓出來,因此我們就達到我們的目的了。
※ 顯示選單函式
選單函式主要的功能就是要求使用者輸入的資料是否正確,這樣在主程式判斷的時候就不用還要做錯誤處理的功能,因為選單函式已經做掉了。
Example:
char menu()
{
puts("1) go case 1");
puts("2) go case 2");
puts("3) go case 3");
puts("4) go case 4");
puts("q) go exit");
printf("Choice: ");
char ans = tolower(getchar());
clearstdin();
while (!strchr("1234q", ans)) (1234q以外的字元排除)
{
printf("error option, please enter again: ");
ans = tolower(getchar());
clearstdin();
}
return ans;
}
這函式主要做到幾項功能:
* 顯示選單
* 取得使用者輸入字元
* 排除輸入錯誤字元
* 回傳正確字元
※ 選擇程式
要怎麼樣依使用者輸入的資料做選擇,那就是使用switch了,這邊我們要用到剛剛的顯示選單的函式,它會回傳一個正確的使用者輸入的字元,所以這邊我們就不用管對錯了,因為一定保證是對的,剛剛的函式就已經錯誤處理掉了。
Example:
char ch;
bool execute = true;
while (execute && (ch = menu()))
{
switch (ch)
{
case '1':
puts("case 1");
break;
case '2':
puts("case 2");
break;
case '3':
puts("case 3");
break;
case '4':
puts("case 4");
break;
case 'q':
puts("exit programe");
execute = false; (q的話讓執行中止)
break;
default:
puts("error");
break;
}
}
看上去非常的簡單,只是重點在於execute這個開關,正常的情況下它是true就是會一直執行,但是當你輸入q的時候,就會把開關關起來了,這樣下一次執行while的時候就會離開了,如果你要問為什麼execute要放在(ch = menu())前面的話,那你可能要先了解while在判段式的時候是由左向右,而且當一遇到0的時候後面完全不看,所以execute放在前面,一直行到馬上為false那就立刻離開了。
※ 完整範例
Example:
#include
#include
#include
#include
char menu(void);
void clearstdin(void);
int main()
{
char ch;
bool execute = true;
while (execute && (ch = menu()))
{
switch (ch)
{
case '1':
puts("case 1");
break;
case '2':
puts("case 2");
break;
case '3':
puts("case 3");
break;
case '4':
puts("case 4");
break;
case 'q':
puts("exit programe");
execute = false;
break;
default:
puts("error");
break;
}
}
return 0;
}
char menu()
{
puts("1) go case 1");
puts("2) go case 2");
puts("3) go case 3");
puts("4) go case 4");
puts("q) go exit");
printf("Choice: ");
char ans = tolower(getchar());
clearstdin();
while (!strchr("1234q", ans))
{
printf("error option, please enter again: ");
ans = tolower(getchar());
clearstdin();
}
return ans;
}
void clearstdin()
{
while (getchar() != '\n');
}
※ 單一字元讀取問題
為了一次取得使用者輸入的一個字我們需要使用到getchar()但是這個函式往往讓初學者一直遇到相同的問題,就是它會將'\n'的換行字元留在stdin之中,讓你下一次取得字元的時候自動讀入很麻煩,所以我們要想一個辦法清空stdin讓換行字元被刪除。
Example:
void clearstdin()
{
while (getchar() != '\n');
}
它會讓stdin中所有的字元不斷的被getchar()出來,直遇到'\n'換行字元,而且會連換行字元都被抓出來,因此我們就達到我們的目的了。
※ 顯示選單函式
選單函式主要的功能就是要求使用者輸入的資料是否正確,這樣在主程式判斷的時候就不用還要做錯誤處理的功能,因為選單函式已經做掉了。
Example:
char menu()
{
puts("1) go case 1");
puts("2) go case 2");
puts("3) go case 3");
puts("4) go case 4");
puts("q) go exit");
printf("Choice: ");
char ans = tolower(getchar());
clearstdin();
while (!strchr("1234q", ans)) (1234q以外的字元排除)
{
printf("error option, please enter again: ");
ans = tolower(getchar());
clearstdin();
}
return ans;
}
這函式主要做到幾項功能:
* 顯示選單
* 取得使用者輸入字元
* 排除輸入錯誤字元
* 回傳正確字元
※ 選擇程式
要怎麼樣依使用者輸入的資料做選擇,那就是使用switch了,這邊我們要用到剛剛的顯示選單的函式,它會回傳一個正確的使用者輸入的字元,所以這邊我們就不用管對錯了,因為一定保證是對的,剛剛的函式就已經錯誤處理掉了。
Example:
char ch;
bool execute = true;
while (execute && (ch = menu()))
{
switch (ch)
{
case '1':
puts("case 1");
break;
case '2':
puts("case 2");
break;
case '3':
puts("case 3");
break;
case '4':
puts("case 4");
break;
case 'q':
puts("exit programe");
execute = false; (q的話讓執行中止)
break;
default:
puts("error");
break;
}
}
看上去非常的簡單,只是重點在於execute這個開關,正常的情況下它是true就是會一直執行,但是當你輸入q的時候,就會把開關關起來了,這樣下一次執行while的時候就會離開了,如果你要問為什麼execute要放在(ch = menu())前面的話,那你可能要先了解while在判段式的時候是由左向右,而且當一遇到0的時候後面完全不看,所以execute放在前面,一直行到馬上為false那就立刻離開了。
※ 完整範例
Example:
#include
#include
#include
#include
char menu(void);
void clearstdin(void);
int main()
{
char ch;
bool execute = true;
while (execute && (ch = menu()))
{
switch (ch)
{
case '1':
puts("case 1");
break;
case '2':
puts("case 2");
break;
case '3':
puts("case 3");
break;
case '4':
puts("case 4");
break;
case 'q':
puts("exit programe");
execute = false;
break;
default:
puts("error");
break;
}
}
return 0;
}
char menu()
{
puts("1) go case 1");
puts("2) go case 2");
puts("3) go case 3");
puts("4) go case 4");
puts("q) go exit");
printf("Choice: ");
char ans = tolower(getchar());
clearstdin();
while (!strchr("1234q", ans))
{
printf("error option, please enter again: ");
ans = tolower(getchar());
clearstdin();
}
return ans;
}
void clearstdin()
{
while (getchar() != '\n');
}