如何解决程序未做应做的事-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 举报,一经查实,本站将立刻删除。