输入时出错

时间:2016-08-26 07:46:20

标签: c

嘿我不明白为什么我把它作为输入时接受两个输入。我在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上尝试了这个代码但得到了同样的错误。

输出

enter image description here

2 个答案:

答案 0 :(得分:1)

遇到了问题!

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

将菜单scanf编辑为: -

 scanf("%d",&k);

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

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

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

我认为程序的其余部分应该运行良好。

答案 1 :(得分:1)

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…