程序未做应做的事-C

如何解决程序未做应做的事-C

| 我编写了一个程序,该程序从用户那里接收一系列数字(<= 20),而最后一个'0'表示系列的结尾(不包括在系列存储中)。 2个大小为20的数组(x,y)(\'0 \'为0-19 + 1)必须为零,并且m表示Y数组中的器官数目。 用户必须输入数字升序(确定为4ex。1,2,3,7,8,...,0),并以\'0 \'结尾,如果没有,则将出现适当的错误消息,程序将关闭。 我们可以确定用户将保留<= 20个输入数字。 Y数组将是X的排序数组(如果X数组一切正常),但没有重复项。 \'m \'将是Y中的器官数目,当然不包括\'0 \'。 函数SIFT必须仅组织要从main()打印的Y数组。 例: 如果用户将存储在X中:1,1,5,6 屏幕上将是:m = 5 Y = 1,6 我的代码
#include <stdio.h>
#include <string.h>

void SIFT(int x_arr[ ],int y_arr[]);

int main ()
{
    int x[20] = {0},y[20] = {0};
    int m=0,temp=0,curr=0,i=0,j=0;

    printf(\"Please enter your numbers Now:\\n\\n\");

    /*enter numbers one by one. if x[i+1] value < x[i] value,err msg.
      when user want to end the series he must enter \'0\' which means end of string (it wont       included in x[]) */
    while ( ( temp = getchar() ) != \'0\' )
    {
        if (temp >= curr)
        {
            x[i] = temp;
            curr = temp;
            i++;
        }
        else
        {
            printf(\"The numbers are not at the right order !\\n\\nProgram will Now terminate...\\n\\n\");
        }
    }

    SIFT(x,y);

    for (i=0 ; y[i]==\'0\' ; i++) /*strlen(y) without (\'0\')\'s includes*/
        m++;

    /*Prints  m,y\'s organs*/
    printf(\"\\n\\nm = %d\",m);
    printf(\"Y = \");
    while (y[j]!=\'0\')
    {
        printf (\"%d,\",y[j]);
        j++;
    }

return 0;
}

void SIFT(int x_arr[ ],int y_arr[])
{
    int i=0,j=0;

    while (x_arr[i] != \'0\')
    {
        if (x_arr[i] == x_arr[i+1]) /*if current val. equals next val. -> jump dbl at x_arr*/
        {
            y_arr[j] = x_arr[i];
            i+=2;
            j++;
        }
        else
        {
            y_arr[j]=x_arr[i];
            i++;
            j++;
        }
    }    

}
由于某种未知的原因,由于任何合法的输入,我都会收到“数字不正确的顺序...”错误消息... 如果有人可以修复它,使它可以正常工作,我会非常高兴,因为到目前为止,我仍然可以看到一切似乎都很好...... 谢谢 :( ...     

解决方法

getchar()
并没有您认为的那样。阅读其描述(http://pubs.opengroup.org/onlinepubs/9699919799/functions/getchar.html)。 您可以改用
scanf()
(http://pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html),或者更好的是
fgets()
sscanf()
。     ,修复输入解析(例如,以ѭ5表示),您的代码仍然存在一些问题: 1)您假设输入是有序的(但不严格)。因此,您不需要将所有内容存储在ѭ6中,您可以在输入时仅比较前一个数字和当前数字。如果当前编号比以前的编号(严格)更大,则将其存储,并增加
m
。如果比以前的少,则必须退出。如果它们相等,则什么也不做:
while ( scanf(\"%d\",&temp) == 1 && temp != 0 && m < 20) {
    if (temp > curr) {
        y[m++] = temp;
    }
    else if (temp < curr) {
        printf(\"The numbers are not at the right order !\\n\\nProgram will now terminate...\\n\\n\");
        exit(0);
    }
    curr = temp;
}
(因此,您不再需要
SIFT
和数组ѭ6))。 2)在终止条件下您不退出程序,仅打印一条消息! (上面已修复)。 3)我在循环中添加了“ 11”条件,以确保在行为不当时不会发生段错误。 那应该使您走上正轨。请注意,既然您正在使用
scanf
,终止条件不再是一个字符(
\'0\'
),而是一个数字(
0
)。并记住顶部的
#include <stdlib.h>
(for16ѭ)     ,您很可能使用的是
getchar()
,而不是
fgets()
。您在输入数字后按换行符吗?     ,首先,如果您在“错误打印”语句中包含
temp
curr
的值,将会很有帮助。 由于其他人已经说过了,所以您不想读一个字符,而是想读一个数字。 pmg在他的回答中提供的链接应该可以帮助您解决。另外,使用断点进行调试可能可以帮助您快速识别此问题,我敦促您研究一些基本的调试技巧。打印错误到目前为止只能帮助您:)     ,您不用ѭ1来读取数字,它的目的是从输入缓冲区中读取单个字符! 例如,您需要致电
scanf()
fgets()
。     ,也, 如果我理解正确,我想你的意思是
for (i=0 ; y[i] != \'0\' ; i++) /* strlen */
    m++;
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?