繁体   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