程序没有做它应该做的事情 – 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语句中包含temp
和curr
的值,那将非常curr
。
由于其他人已经说过,你不想读一个字母,你想读一个数字。 pmg在他的回答中提供的链接可以帮助您找到解决方案。 此外,使用断点调试可能有助于您快速识别此问题,我恳请您调查一些基本的调试技能..打印错误只能让你到目前为止:)
你不使用getchar()
来读取数字,它的目的是从输入缓冲区中读取单个字符!
例如,您需要调用scanf()
或fgets()
。
也,
如果我理解正确,我想你的意思是
for (i=0 ; y[i] != '0' ; i++) /* strlen */ m++;