所以,基本上,这只是完整程序的一部分。我在这里尝试做的(但不是真的成功)是在我的数组中输入10个值。因此,当我按下'e'时,我能够将值输入到我的数组中,直到我输入0.我想要做的是能够从我在数组中停止的位置继续。这意味着如果我在前三个元素中输入值,下次我按“e”时,我想继续从元素四开始,当它达到10个值时,我不能再输入任何值。我已经尝试了一些if语句和不同的循环,但似乎无法正确。我还是很新,所以任何帮助都会受到赞赏!
这是我的代码
int main(void)
{
char choice;
printf("Measurement tool 1.2\n");
loadMenu(choice);
return 0;
}
void loadMenu(char theChoice)
{
int values[X]= {0};
float counter = 0.0f;
int i;
do
{
printf("VECRQ? ");
scanf(" %c",&theChoice);
switch(theChoice)
{
case 'v':
printf("[");
for(i=0; i<X; i++)
{
printf("%d ",values[i]);
}
printf("]\n");
break;
case 'e':
scanValue(values);
break;
case 'c':
maxmin(values, counter);
average(values, counter);
normValue(values);
break;
case 'r':
for(i=0; i<X; i++)
{
values[i] = 0;
}
printf("Measurement values cleared!\n");
break;
case 'q':
printf("Exit measurement tool!\n");
break;
default:
printf("Wrong character! Choose between VECRQ.\n");
}
} while(theChoice != 'q');
}
void scanValue(int theValues[])
{
int i; int j=0;
{
for(i=0;i<X;i++)
{
printf("Enter measurement %d (or 0):",i+1);
scanf("%d",&theValues[i]);
j=i;
if(theValues[i]==0)
break;
}
for(j; j<X; j++)
{
printf("Enter measurement %d (or 0):\n",j+1);
scanf(" %d",&theValues[j]);
if(theValues[j]==0)
break;
}
}
答案 0 :(得分:1)
您的scanValues
函数每次都从0开始,因此如果您已经在数组中输入了anythig,它将不会注意到。
如果你首先遍历数组,寻找零开始,如下所示:
for (i = 0; i < X; ++i)
{
if (theValues[i] == 0)
{
// We found where we last left off
break;
}
}
然后i
将被设置为第一个零的位置。如果您不在现有循环中重新初始化i
,它将保持相同的值,并从那里一直到X
(如果它已经在X
,因为所有值不为零,循环不会发生。)
在j
上进行另一个循环只是做同样的事情将意味着所有的值将被多次读取;你应该完全摆脱那个循环,因为你的i
循环处理它。
如果你这样做,你需要确保从数组元素开始全部为零;因为你已经在loadMenu
的顶部做了这个,这应该是好的。
答案 1 :(得分:0)
如果要在scanValue函数内部提醒最后使用的数组索引,可以轻松地为函数成员使用static修饰符。像:
void scanValue(int theValues[]) {
static int i;
//... the logic of your function goes here
}
在函数内声明静态变量时,此变量的值在函数的所有调用之间保持。例如,看看这个小代码:
void main() {
getNextIdx(); //Will return 1
getNextIdx(); //Will return 2
}
void getNextIdx() {
static int i = 0;
i++;
return i;
}
您可以利用此C语言资源来简化您的需求。当然,如果我理解你真正想要的东西。
Ps。:有时您可能希望清除函数内部静态变量的值,因此,为此,您可以传递一个布尔值,让函数知道您要清除变量,并且使逻辑在函数内部清除它。
希望我能帮助你。