程序没有做它应该做的事情 - C.

时间:2011-04-14 14:06:30

标签: c

我编写了一个程序,它从用户那里接收一系列数字(< = 20),而最后一个'0'表示系列结束(不包括在系列存储中)。 2个数组(x,y)的大小为20(0-19 + 1为'0')必须为零,m为Y数组中的器官数。

用户必须输入数字升序(确定4ex.1,2,2,3,7,8,...,0)并以“0”结束,如果没有,相应的错误信息将出现,程序将关闭。

我们可以确定用户将保留< = 20个输入数字。

Y数组(如果X数组一切正常)将是一个排序的X数组但没有重复。 'm'将是Y中的器官数量,当然不包括'0'。

功能SIFT必须只组织Y数组以便从main()打印。

示例:

如果用户将存储在X:1,1,2,3,5,5,5,6

屏幕上将是:m = 5 Y = 1,2,3,5,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++;
        }
    }    

}

由于某些未知原因,对于任何类型的法律输入我都会收到“数字不正确...”错误消息...

如果有人可以修理它以使其正常工作,我会非常高兴,因为直到现在我看到一切似乎都没问题.....

谢谢:( ...

6 个答案:

答案 0 :(得分:3)

getchar()没有按照您的想法行事。阅读其说明(http://pubs.opengroup.org/onlinepubs/9699919799/functions/getchar.html)。

您可以尝试scanf()代替(http://pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html),或者更好,fgets()sscanf()

答案 1 :(得分:1)

修复输入解析(例如scanf),您的代码仍有一些问题:

1)您假设输入是有序的(但不严格)。因此,您无需将所有内容存储在x中,您可以在输入时仅比较之前的数字和当前数字。如果当前数字比之前(严格)更大,则存储它,并增加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和数组x。)

2)你没有在终止条件下退出程序,只需打印一条消息! (在上面修正)。

3)我在循环中放置m < 20条件,以确保在行为不当的输入处不会发生段错误。

那会让你走上正轨。现在观察到您正在使用scanf,终止条件不再是char('0')而是数字(0)。请记住顶部的#include <stdlib.h>exit()

答案 2 :(得分:0)

您很可能使用的是getchar(),而不是fgets()。你输入数字后是否按了换行符?

答案 3 :(得分:0)

您不使用getchar()来读取数字,它的目的是从输入缓冲区中读取单个字符!

例如,您需要致电scanf()fgets()

答案 4 :(得分:0)

首先,如果您在错误打印语句中包含tempcurr的值,那将会非常有用。

由于其他人已经说过,你不想读一个字符,你想读一个数字。 pmg在他的回答中提供的链接可以帮助您找到解决方案。此外,使用断点进行调试可能有助于您快速识别此问题,我建议您调查一些基本的调试技巧。打印错误只能让您到目前为止:)

答案 5 :(得分:0)

此外,

如果我理解正确,我认为你的意思是

for (i=0 ; y[i] != '0' ; i++) /* strlen */
    m++;