我尝试编写一个程序,让用户将整数值插入数组,直到他们输入要停止的特定键,例如 ENTER 或 X
int array_numb[100];
char quit = 'x';
printf("Enter as many values into the array as you want, pressing x will end the loop\n");
while(1==1){
int i = 0;
scanf("%i",&array_numb[i]);
i++;
array_numb[i] = quit;
}
我知道这是错的,但这是我的思考过程。有任何想法吗?谢谢你的帮助
答案 0 :(得分:2)
Enter as many values into the array as you want
在int array_numb[100];
的同时,您将遇到麻烦。如果用户在委托sentinel value之前输入超过100个数字怎么办?你会超出分配的内存,不是吗?
您应该检查scanf()
的返回值以确保输入正确。提供的格式说明符和输入类型不匹配将导致scanf()
失败。查看man page了解详情。
您需要在break
循环中有一个while(1)
语句才能突破。否则,您需要在while()
循环的控制表达式中使用条件语句来终止循环。
注意:恕我直言,阻止扫描用户输入的最佳方法是将scanf()
的返回值与EOF
相对照,这可以通过在linux上按 CTRL + D 并在Windows中按 CTRL + Z 来生成。
您可以查看this answer以供参考。
答案 1 :(得分:1)
可以实现同样的目的,如下所示:
scanf()
可能会失败并检查返回值。扫描字符时scanf()失败
int i=0;
printf("Enter as many values into the array as you want, pressing x will end the loop\n");
while(i<100 && scanf("%d",&array_numb[i])==1)
{
i++;
}
答案 2 :(得分:0)
scanf
的 %i
在插入无效数据(例如插入字符)时将无法扫描数字,如果失败则返回0(在您的情况下)。
只需检查scanf
的返回值即可。如果为零,请使用
if(getchar()=='x') //or if(getchar()==quit)
break;
注意:使用
清除/刷新标准输入流(stdin
)
int c;
while((c=getchar())!='\n' && c!=EOF);
在循环之后以及break;
之后。
答案 3 :(得分:0)
你可以学习一些东西并使用信号: http://man7.org/linux/man-pages/man7/signal.7.html
注册SIGINT,覆盖它,让它检查按下了哪个键,然后让它更改变量。在循环中检查此变量是0还是1。
信号具有最高优先级,无论循环如何都将执行信号代码。 示例:http://www.thegeekstuff.com/2012/03/catch-signals-sample-c-code/
对于这个案子来说这太过分了,但要知道这件事很有趣。信号是操作系统管理事件的方式,如进程终止,键盘输入等。请注意,如何使用它是特定于操作系统的,与C本身没什么关系。