首页 > 解决方案 > 按下回车时停止获取用户输入(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;
            
} 

标签: arrayscscanf

解决方案


如果你想停在空行上,你不能使用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也会在文件结束时终止用户输入;如果您通过从文件重定向它来为程序提供输入,这很好

推荐阅读