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