我正在写一段代码,我想确保用户只输入一个1-10之间的整数,并将该值存储在一个二维数组中。我试图使用指针来完成这项任务。
#include <stdio.h>
int main()
{
//Declaration of a 2D array
int movie_Scores [8][5];
//Declaration of a pointer variable which points to the address of the 1st element
int *p;
p=&movie_Scores;
//Array of pointers to strings and initializtion
char movie_Names[][100] = {"1. Movie 1",
"2. Movie 2",
"3. Movie 3",
"4. Movie 4",
"5. Movie 5",
"6. Movie 6",
"7. Movie 7",
"8. Movie 8"
};
for(int i=0; i<5; i++)
{
printf("Judge %d, rate each movie from 1-10:\n\n", i+1);
for(int j=0;j<8;j++)
{
printf("\n%s\t:", movie_Names[j]);
scanf("%d", (p+i+(j*5)));
while(*(p+i+(j*5))<1 || *(p+i+(j*5))>10)
{
printf("Enter number between 1-10:\n");
printf("\n%s\t:", movie_Names[j]);
scanf("%d", (p+i+(j*5)));
}
}
}
}
目前,我的代码接受输入并直接将其存储到数组中,而不检查输入的值是否在1-10之间。
4条答案
按热度按时间sauutmhj1#
输入函数不测试有效范围。(事实上,这是
scanf
的一个已知错误。有关令人眼花缭乱的原因,请参见here和here。)您需要在获得值后测试它。在C中获取输入实际上是一件相当令人讨厌的事情。你可以自己编写一个帮助函数,把所有杂乱的东西放在一个地方,然后你可以在其他地方使用它。
另外,使用更好的变量名,不要引入不必要的变量。
编辑:顺便说一句,如果我不提到今天的神奇数字5和8,我将是失职。
你不应该使用幻数,而是在某处提供一个 named 值。
然后,您可以在任何需要的地方使用这些标识符:
以及:
等等。
imzjd6km2#
首先,我将编写一个函数,读取一个int并根据输入检查它,如果读取的是可接受的int,则返回
1
,如果读取的不是可接受的int,则返回0
。现在,您可以调用它并检查它,然后使用它循环,直到您在另一个函数中获得“有效”的输入(如果需要),或者只是退出并显示错误消息(如果这是所需的行为)。
uz75evzq3#
如何验证用户实际输入的是整数的问题已经在此问题中得到了回答:
Validate the type of input in a do-while loop C
因此,问题仍然是如何验证用户输入的整数是否也在
1
到10
的范围内。为了做到这一点,您只需要一个
if
语句,但是,如果您希望自动重新提示用户输入,那么您还需要一个循环。在下面的解决方案中,我使用了上面提到的问题的解决方案中的函数
get_int_from_user
,并做了一些小的修改,使其接受printf
样式的输入,该函数自动验证用户输入的整数是否有效,如果无效,则自动重新提示用户输入。此程序具有以下行为:
请注意,出于演示目的,我将
NUM_JUDGES
从5
简化为3
。jk9hmnmh4#
据我所知,唯一的选择是简单地使用
scanf
,如果数字小于1或大于10,可以打印类似"Please enter a number from 1 to 10.
的内容,然后再次使用scanf
,直到得到1到10之间的数字。