[英]How to exit C program using Enter key
當程序要求輸入數字時,我正在嘗試通過按Enter鍵來找出退出程序的方法。
我在main()
中嘗試了這個if
語句,但它似乎不起作用。
int main()
{
while(1){
int val;
printf("\nnumber to convert:\n ");
scanf("%i", &val);
ibits(val);
if (val = '\n')
{
break;
}
}
return 0;
}
你真的不應該直接使用scanf
......特別是如果你期待多種可能的格式。
考慮改用fread
,然后將輸入轉換為正確的格式。
IE:
int main() {
while (1) {
char buf[1024];
printf("\nnumber to convert:\n ");
unsigned long len = fread(buf, 1, 1023, stdin);
buf[len] = 0;
if (len == 0 || (len == 1 && buf[0] == '\n') ||
(len == 2 && buf[0] == '\r' && buf[1] == '\n'))
break;
int val = atoi(buf);
ibits(val);
}
return 0;
}
這也將允許您驗證輸入並測試溢出攻擊:
int main() {
while (1) {
char buf[1024];
printf("\nnumber to convert:\n ");
unsigned long len = fread(buf, 1, 1023, stdin);
buf[len] = 0;
if (len > 11)
goto under_attack;
if (len == 0 || (len == 1 && buf[0] == '\n') ||
(len == 2 && buf[0] == '\r' && buf[1] == '\n'))
break;
if (buf[0] != '-' && (buf[0] < '0' || buf[0] > '9'))
goto under_attack;
int val = atoi(buf);
ibits(val);
}
return 0;
under_attack:
fprintf(stderr, "Under attack?!\n");
return -1;
}
以我的經驗,嘗試這樣做真的很痛苦。 能夠做到這一點會很好,但很難。
根據我對scanf
的經驗,如果您在沒有任何內容的情況下按enter
,那么scanf
命令只會等到您鍵入屏幕上出現的一些字符,然后按enter
。
您可以通過更改您正在使用的終端的屬性來解決此問題,但是您需要在程序完成后再次更改屬性。 - 然后您可以對其進行設置,以便程序響應單個按鍵而不是scanf
,您必須輸入內容然后按return
鍵。 有關更多詳細信息,請參閱此問題
一般來說,有一個退出條件會更容易,例如您讀取的值為0
或負數,例如,使用scanf
退出。 這確實是最簡單的解決方案。
或者,您可以使用字符串輸入加載一個數字
scanf("%s",string);
val = atoi(string);
atoi
將 ascii 轉換為 integer。
所以現在你可以測試字符串的第一個字符,看看它是Q
還是q
表示退出.....
scanf("%s",string);
if (string[0]=='q' || string[0]='Q') return 0;
val = atoi(string);
請注意, string
使用
char string[50];
或類似的東西。
請注意,我們還應該檢查評論中指出的scanf
的返回值......
check=scanf("%s",string);
if (check!=1) {printf("scanf error\n"); return 0;}
if (string[0]=='q' || string[0]='Q') return 0;
val = atoi(string);
正如評論中指出的那樣,您還可以使用gets(string);
讀取string
; 而不是scanf("%s",string);
.
評論中的另一個優點是 string 被聲明為[50]
long 如果使用scanf
來使用scanf("%49s",string);
會更好。 它將最多讀取 49 個字符,以防止字符串溢出問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.