程序没有做它应该做的事情 – 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  #include  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 = 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()

修复输入解析(例如使用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 (对于exit()

很可能你使用的是getchar()而不是像fgets()这样的东西。 输入数字后你是否按了换行符?

首先,如果您在Error Print语句中包含tempcurr的值,那将非常curr

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

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

例如,您需要调用scanf()fgets()

也,

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

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