【问题标题】:Error While taking the input输入时出错
【发布时间】:2016-08-26 07:46:19
【问题描述】:

嘿,我不明白为什么我在将元素作为 input 时需要两个输入。我在 TurboC 编译器 GCC 上尝试了这段代码,但得到了同样的错误。

#include <stdio.h>


int menu();
void bubble_short();
void selection_short();

int main()
{
    int ch,j,n,a[100];

    ch=menu();

    switch (ch)
    {
            case 1:
                    {
                        bubble_short();
                        break;
                    }
            case 2:
                    {
                        selection_short();
                    }
            default  :
                    break;
        }
}

void bubble_short()
{
    int i,j,n,a[100];
    printf("Elements");
    scanf("%d",&n);
    for (j=0; j<n;j++)
    {
        scanf("%d",&a[j]);
    }
    for (i=0;i<n;i++)
    {
        for (j=0;j<n-1-i;j++)
        {
            if (a[j]>a[j+1])
            {
                a[j]=a[j]+a[j+1];
                a[j+1]=a[j]-a[j+1];
                a[j]=a[j]-a[j+1];
            }
        }
    }

    printf("the sorted elements are :\n");
    for ( i = 0; i < n; i++)
    {
        printf("%d\n",a[i]);
    }
}


void selection_short()
{
    int i,j,n,a[100],min;
    printf("Elements");
    scanf("%d",&n);
    for ( i = 0; i <n-1; ++i)
    {
        min=i;
        for ( j = 1+i; i < n; ++i)
        {
            if(a[min]>a[j])
                min=j;
        }
        if(i!=min)
        {
            a[i]=a[i]+a[min];
            a[min]=a[i]-a[min];;
            a[i]=a[i]-a[min];;
        }
    }

    printf("the shorted elements are :\n");
    for ( i = 0; i < n; ++i)
    {
        printf("%d\n",a[i] );
    }
}

int menu()
{
    int k;
    printf("Enter the choice \n 1. bubble short \n 2. selectionshort");
    scanf("\n %d ",&k);
    return k;
}

嘿,我不明白为什么我在将元素作为输入时需要两个输入。我在 TurboC 编译器 GCC 上尝试了这段代码,但得到了同样的错误。

输出

【问题讨论】:

  • void bubble_short(int n) --> void bubble_short(void)
  • 那是什么错误?据您解释,您两次收到相同的错误。要我们自己去你家看看吗?把它放在这里让我们读一下不是更容易吗?
  • 我在这里附上我的 C 文件。我不知道为什么 scanf 比 printf 之前运行。我在这里附上完整的代码。执行后它应该只接受一个输入,它需要 2,最后一个是第二个 scanf 。
  • @LuisColorado 请立即检查我的输出中的错误,并附上代码。为什么我必须在输出上写的元素上方输入两个输入。

标签: c


【解决方案1】:

有你的问题!

切勿在 scanf 中使用换行符、空格、制表符和回车符,以避免此类问题并保持良好的编码准则!这些作为它的分隔符,您提供了其中的 3 个。

将您的菜单 scanf 编辑为:-

 scanf("%d",&k);

其背后的基本逻辑:- 举一个基本的例子:-

scanf("%d %d", &i, &j);

注意两个占位符之间的空间。当你运行它时,它会接受第一个输入,然后它会等待从键盘读取分隔符,然后它会读取输入的第二个参数。

我认为程序的其余部分应该可以正常运行。

【讨论】:

  • “谢谢”它对我有用。感谢您提供这背后的基本概念。
【解决方案2】:

menu() 函数中,你有:

scanf("\n %d ",&k);

不需要前导空格字符('\n'' '); %d 无论如何都会跳过前导空格,一个就足够了。请注意,scanf() 等格式字符串中的每个空格字符都映射到输入中的零个或多个空格字符。

尾随空格不好。这意味着跳过零个或多个空白字符(换行符、空格、制表符)并继续前进,直到您看到不是空白字符的内容(或直到 EOF)。在格式字符串中尾随空格是一个坏主意——当输入应该是交互式的时更是如此。在终止当前输入之前,您必须预测下一个输入应该是什么,这对人们来说并不容易。


还有许多其他问题。您的函数声明不是原型(您必须编写 int menu(void); 等以使其成为 C 中的原型)。在case 2: 之后你错过了一个休息时间——它目前恰好是无害的,但是当你将错误消息或其他排序选项放入系统时,它就会成为一个问题。您还没有使用足够的功能:您应该有一个数组读取功能和一个数组打印功能,并且应该使用它们。您已将数据读取循环排除在 selection_short() 函数之外。通常,使用的术语是 sort,而不是 short — 函数名称对大多数人来说似乎是异常的。

你的交换算法被扭曲了:

a[i]=a[i]+a[min];
a[min]=a[i]-a[min];;
a[i]=a[i]-a[min];;

您不需要双分号。如果值足够大,您将面临溢出的风险。它更简单、更正统——最终更安全——使用:

int tmp = a[i];
a[i] = a[min];
a[min] = tmp;

您应该检查每个scanf() 调用以确保它成功,如果失败则采取适当的措施。请注意,返回0EOF 可能会失败;你应该测试:

if (scanf("%d", &n) != 1)
    …oops…

【讨论】:

  • 感谢 Jonathan Leffer 指出我的错误......我是初学者,我一定会记住你的观点。
猜你喜欢
  • 1970-01-01
  • 2016-06-26
  • 2012-05-11
  • 2022-12-18
  • 2018-12-11
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多