【问题标题】:How do I let a user enter a number of inputs in C?如何让用户在 C 中输入多个输入?
【发布时间】:2022-01-24 02:59:20
【问题描述】:
#include <stdio.h>

int main(){
    int num, counter, numberOfInputs, even, odd, sumEven, sumOdd;
    
    printf("Enter number of inputs:\n ");
    scanf("%d", &numberOfInputs);
    
    printf("Enter %d numbers: ", numberOfInputs);
    for(counter=1; numberOfInputs>counter; counter++){
        scanf("%d", counter);

    return 0;
}

我有一个项目可以让用户输入一些输入。我似乎无法解决它。我完成了程序的其他部分,它将确定奇数和偶数的数量关系,我只是没有包括它。 请帮助和tnx

后续问题:

为什么我用printf显示输入的数字,最后输入的数字总是加1?

#include <stdio.h>

int main(){
    int num, counter, numberOfInputs, even, odd, sumEven, sumOdd;
    
    printf("Enter number of inputs:");
    scanf("%d", &numberOfInputs);
    
    printf("Enter %d numbers:\n", numberOfInputs);
    for(counter=0; numberOfInputs>=counter;){
        scanf("%d", &counter);
        counter++;
    }
    /*when I put a printf here, the last number is added by 1, it works fine without the printf though*/

【问题讨论】:

  • scanf("%d", counter) 是这里的一个问题。你也应该得到编译器的警告
  • 如果您的编译器没有为您提供警告消息,那么您应该查阅编译器的文档以了解如何启用警告。如果您使用的是 gcc 或 clang,则可以使用 -Wall -Wextra 编译以启用所有警告。
  • 1) scanf("%d", counter); 是一个错误。你可能想要scanf("%d", &amp;counter); 2)这也可能是一个错误:你真的想在循环内部覆盖你的循环计数器吗? 3)你真的想要变量int count吗?而不是值的数组(例如int[] counts)?
  • int num,计数器,numberOfInputs,偶数,奇数,sumEven,sumOdd; printf("请输入输入数:\n"); scanf("%d", &numberOfInputs); printf("请输入 %d 个数字:\n", numberOfInputs); for(counter=0; numberOfInputs>counter;){ scanf("%d", &counter);计数器++;伙计们,我想我离解决方案更近了。但是当我输入 5 作为输入数时,它会在输入最后一个数字后加 ​​1。
  • 如果这会使现有答案无效,请不要覆盖您的原始问题。如果您有后续问题,请将其添加到问题的底部。我已经为你解决了这个问题。如果您对我的更改不满意,请随时编辑您的问题。

标签: c


【解决方案1】:

回答原问题:

线

scanf("%d", counter);

错了,有几个原因:

%dscanf 转换格式说明符需要int 的地址才能写入(即指针)。但是,您没有传递这样的地址。相反,您将循环计数器的值传递给它,这没有意义。

如果您改为将行更改为

scanf( "%d", &counter );

然后将满足%d 转换格式说明符的要求。但这仍然没有意义,因为这会导致循环计数器被用户输入覆盖。

另一个问题是行

for(counter=1; numberOfInputs>counter; counter++){

错了,因为这个循环只会进行numberOfInputs - 1 迭代,尽管您可能想要进行numberOfInputs 迭代。

此外,检查scanf 的返回值通常总是一个好主意,如果它无法匹配输入,则提供错误消息。

在您的问题中,您没有指定是否要这样做

  • 记住用户输入的所有输入,或者
  • 在处理完所有输入后丢弃它们。

但是,根据代码中的变量名称 sumEvensumOddevenodd,我假设您只想计算所有偶数和奇数的总和,并且偶数和奇数的个数。在这种情况下,您不必记住所有输入;它们可以在处理后丢弃。在这种情况下,您的代码应如下所示:

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    int numberOfInputs, numEven = 0, numOdd = 0, sumEven = 0, sumOdd = 0;
    
    printf( "Enter number of inputs: " );
    if ( scanf( "%d", &numberOfInputs ) != 1 )
    {
        printf( "input failure!" );
        exit( EXIT_FAILURE );
    }
    
    printf( "Enter %d numbers: ", numberOfInputs );

    for( int counter = 0; counter < numberOfInputs; counter++ )
    {
        int num;
        if ( scanf( "%d", &num ) != 1 )
        {
            printf( "input failure!" );
            exit( EXIT_FAILURE );
        }

        //process input

        //determine whether number is odd or even
        if ( num % 2 == 0 )
        {
            numEven++;
            sumEven += num;
        }
        else
        {
            numOdd++;
            sumOdd += num;
        }
    }

    printf( "\n" );
    printf( "Number of even numbers: %d\n", numEven );
    printf( "Number of  odd numbers: %d\n", numOdd  );
    printf( "\n" );
    printf( "Sum of even numbers: %d\n", sumEven );
    printf( "Sum of  odd numbers: %d\n", sumOdd );

    return 0;
}

这个程序有以下输出:

Enter number of inputs: 5
Enter 5 numbers: 3 5 6 7 8

Number of even numbers: 2
Number of  odd numbers: 3

Sum of even numbers: 14
Sum of  odd numbers: 15

回答后续问题:

以下循环将执行 numberOfInputs + 1 迭代,尽管您可能只希望它执行 numberOfInput 迭代。

for(counter=0; numberOfInputs>=counter;){
    scanf("%d", &counter);
    counter++;
}

要解决此问题,您可以将其更改为以下内容:

for ( counter = 0; counter < numberOfInputs; counter++ ) {
    scanf("%d", &counter);
}

但是,正如我对原始问题的回答中所述,用用户输入覆盖循环计数器是没有意义的。

【讨论】:

  • 如何打印输入?参考上面的代码
  • @SanBanYo:我已经更新了我的答案,现在它也回答了你的后续问题。
  • @SanBanYo:我现在扩展了我的程序,向您展示如何处理输入,并添加了我的程序的输出。
【解决方案2】:

您发布的代码有几个问题。

第一个scanf("%d", counter) 是错误的。 %d 格式说明符需要一个指向 int (int*) 的指针,而您提供的是 int。逻辑也是错误的,因为您覆盖了counter

此外,您的循环将比numberOfInputs 少执行一次,因为您从1 开始计数,所以它应该是numberOfInputs&gt;=counter

最后,您应该检查scanf 的返回值,看看它是否成功(尝试输入除整数以外的其他内容)。

    for(counter=1; numberOfInputs>=counter; counter++){
        if (scanf("%d", &num) != 1)
             /* handle error */
     }

启用编译器警告也是一个好主意,如果您这样做了,它会检测到scanf 类型冲突。像-Wall 这样的开关将是一个好的开始。

【讨论】:

  • int num,计数器,numberOfInputs,偶数,奇数,sumEven,sumOdd; printf("请输入输入数:"); scanf("%d", &numberOfInputs); printf("请输入 %d 个数字:\n", numberOfInputs); for(counter=0; numberOfInputs>=counter;){ scanf("%d", &counter);计数器++;我做到了伙计们。但是,当我在 for 循环之后放置 printf 以显示输入时,唯一的问题是,它在最后输入的数字中添加了 1。如何打印输入的数字?
  • @SanBanYo 编辑您的问题并添加您在 cmets 中发布的代码。要打印您刚刚收到的号码,请在scanf 之后添加printf("%d\n", num);
猜你喜欢
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
相关资源
最近更新 更多