簡體   English   中英

如何使用 Enter 鍵退出 C 程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM