【问题标题】:Stop getting user inputs when enter is pressed (C language)按下回车时停止获取用户输入(C 语言)
【发布时间】:2020-07-27 13:32:48
【问题描述】:

我是编程的超级新手,我遇到了一个问题,我应该编写一个 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("%d",&amp;num);,您正在读取像123456 这样的字符串作为整数。但随后您尝试将其用作字符if(num == '\n') break;。条件num == '\n' 仅当您输入数字 10 时才会为真
  • 通过使用fgets() 输入字符串。空(换行符除外)字符串终止程序,否则使用sscanf() 处理它。
  • "else printf("介质为 %.2f", arr[(n-1)/2] + arr[n/2]/2.0);"在这一行,您可能想在求和周围使用括号

标签: arrays c scanf


【解决方案1】:

如果你想停在空行,你不能使用scanf。原因是scanf("%d", ...) 在等待用户输入数字时会跳过用户输入中的所有空白字符。这里的“空白”包括换行符'\n'。因此,用户无法通过按 Enter 使scanf 返回 - 只有文件结尾(Linux 上的 Ctrl+D)或伪造输入(非数字)将使scanf 返回。

所以你必须用fgets+sscanf的组合替换scanf。考虑以下代码:

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 将失败(it returns 1 for success;任何其他失败值)。

注意事项:

  • 如果输入太长,会被分成两行,这会让用户感到惊讶
  • 如果用户在一行中输入了多个数字,多余的数字将被忽略
  • fgets 的返回值条件也会在文件结束时终止用户输入;如果您通过从文件重定向来为程序提供输入,这很好

【讨论】:

    【解决方案2】:

    可以逐个字符地处理输入,直到存储 20 个整数或找到换行符为止。
    读取数字时,将它们累积成一个值,检查是否溢出。
    读取空格或其他字符后,将值存储在数组中。

    #include <stdio.h>
    #include <ctype.h>
    #include <limits.h>
    
    int main ( void) {
        int ch = 0;
        int value = 0;
        int sign = 1;
        int digits = 0;
        int arr[20] = { 0};
        int n = 0;
        int i = 0;
        int j = 0;
        int k = 0;
    
        while ( n < 20) {
            while ( EOF != ( ch = fgetc ( stdin))) {//read a character
                if ( isdigit ( ( unsigned char)ch)) {
                    ch -= '0';//character to int as '1' to 1
                    digits = 1;
                    if ( 1 == sign) {
                        if ( value < ( INT_MAX / 10) - ch) {
                            value *= 10;
                            value += ch;
                        }
                        else {
                            printf ( "overflow! reset to + and zero\n");
                            value = 0;
                            sign = 1;
                            digits = 0;
                        }
                    }
                    if ( -1 == sign) {
                        if ( value > ( INT_MIN / 10) + ch) {
                            value *= 10;
                            value -= ch;
                        }
                        else {
                            printf ( "overflow! reset to + and zero\n");
                            value = 0;
                            sign = 1;
                            digits = 0;
                        }
                    }
                }
                else if ( '-' == ch || '+' == ch) {
                    if ( digits) {
                        printf ( "invalid sign! reset to + and zero\n");
                        value = 0;
                        sign = 1;
                        digits = 0;
                    }
                    else {
                        sign = ( '-' == ch) ? -1 : 1;
                    }
                }
                else if ( digits) {
                    arr[n] = value;
                    value = 0;//reset to zero
                    sign = 1;//reset to +
                    ++n;
                    digits = 0;
                }
                if ( '\n' == ch) {
                    break;
                }
            }
            if ( '\n' == ch || EOF == ch) {
                break;
            }
        }
    
        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;
                }
            }
        }
    
        for ( i = 0; i < n; i++) {
            printf ( "arr[%d] = %d\n", i, arr[i]);
        }
    
        if ( n % 2 != 0) {
            printf ( "The median is %d\n", arr[n/2]);
        }
        else {
            printf ( "The median is %.2f\n", ( arr[( n - 1) / 2] + arr[n / 2] ) /2.0);
        }
    
        return 0;
    }
    

    输入输出:

    9 1 82   0    3
    arr[0] = 82
    arr[1] = 9
    arr[2] = 3
    arr[3] = 1
    arr[4] = 0
    The median is 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 2015-05-01
      • 2015-12-24
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      相关资源
      最近更新 更多