arrays - 按下回车时停止获取用户输入(C 语言)
问题描述
我是编程的超级新手,我遇到了一个问题,我应该编写一个 C 程序来让用户输入一些数字并对输入的元素进行排序并找到它的中位数。一旦用户按下回车,它应该停止获取输入。这是我的代码和 idk 出错的地方(顺便说一句,很抱歉问了这么简单的问题)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int i = 0;
int j,k,m,num;
int arr[20];
while(i<20 )
{
printf("Enter a number: ");
scanf("%d",&num);
if(num == '\n') break;
arr[i] = num;
i++;
}
n = sizeof(arr)/sizeof(arr[0]);
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(arr[i] < arr[j])
{
k = arr[i];
arr[i] = arr[j];
arr[j] = k;
}
}
}
if(n%2 != 0)
{
printf("The median is %d", arr[n/2] ) ;
}
else printf("The median is %.2f", arr[(n-1)/2] + arr[n/2]/2.0);
return 0;
}
解决方案
如果你想停在空行上,你不能使用scanf
. 原因是scanf("%d", ...)
在等待用户输入数字时跳过用户输入中的所有空白字符。这里的“空白”包括换行符'\n'
。因此,用户无法scanf
通过按返回Enter- 只有文件结尾( Linux 上的Ctrl+ D)或虚假输入(非数字)才会scanf
返回。
所以你必须用scanf
组合替换fgets
+ sscanf
。考虑以下代码:
while (i < 20)
{
int num;
char str[15];
printf("Enter a number: ");
if (!fgets(str, sizeof str, stdin))
break;
if (sscanf(str, "%d", &num) != 1)
break;
arr[i] = num;
i++;
}
它用于fgets
输入一行输入,并sscanf
解析该行。如果行中没有任何内容,sscanf
将失败(它返回 1 表示成功;任何其他值表示失败)。
笔记:
- 如果输入太长,它会被分成两行,这会让用户感到惊讶
- 如果用户在该行输入多个数字,多余的数字将被忽略
- 的返回值条件
fgets
也会在文件结束时终止用户输入;如果您通过从文件重定向它来为程序提供输入,这很好
推荐阅读
- java - Java导入jar文件:包func不存在
- scala - reduceLeft 的扩展函数缺少参数类型
- python - BigQuery 数据集 ID 无效
- excel - 保护数据透视表后无法过滤切片器
- firebase - Firebase 可以支持反向 DNS 记录吗?
- javascript - 在多表列中具有多个术语的简单 PHP 过滤器
- javascript - JavaScript 在 Firefox Scratchpad 中运行,但在与 HTML 一起加载时不运行
- html - 无论如何我可以让我的导航栏静态,而不是调整到我的侧边栏?
- logstash - 如果日志包含特定单词,则忽略并移至下一个模式
- docker-compose - docker-compose.yml 文件中的特定数据库详细信息?