我正在解决CS50(问题集1),即water.c。它要求用户编写一个程序,在几分钟内提示用户他或她的淋浴时间长度(作为正整数),然后打印相同数量的水瓶(作为整数)。 淋浴1分钟=消耗12瓶 主要问题:问题是我们必须确保用户输入正数分钟,否则它会继续重新提示他返回输入/ scanf语句。只要他进入他进入长度< = 0,我就可以使用while(长度< = 0)条件重新提示他,但当他输入一个字符,即输入中的abc123时,我的代码继续执行。有解决方案??
>
#include <stdio.h>
int main()
{ int length=0;
int min=12;
int bottle=0;
printf("Enter length of his or her shower in minutes");
scanf("%d", &length);
while (length <= 0){
printf("Enter length of his or her shower in minutes");
scanf("%d", &length);
}
bottle= (min*length);
printf("%d", bottle);
return 0;
}
答案 0 :(得分:5)
您可以先通过读取字符串,然后解压缩任何数字来解决此问题:
#include <stdio.h>
int main(void)
{
int length = 0;
char input[100];
while(length <= 0) {
printf("Enter length: ");
fflush(stdout);
if(fgets(input, sizeof input, stdin) != NULL) {
if(sscanf(input, "%d", &length) != 1) {
length = 0;
}
}
}
printf("length = %d\n", length);
return 0;
}
计划会议:
Enter length: 0
Enter length: -1
Enter length: abd3
Enter length: 4
length = 4
至关重要的是,我总是检查scanf
的返回值,即成功转换的项目数。
答案 1 :(得分:2)
如果你不关心像1f
这样的输入,那么上面的答案对你来说没问题,但是如果你不想接受这种输入,那么下面的方法就是这样的:
#include<stdio.h>
int checkInput(void);
int main(void){
int number = checkInput();
printf("\nYour number is\t%d\n",number);
return 0;
}
int checkInput(void){
int option,check;
char c;
do{
printf("Please type a number:\t");
if(scanf("%d%c",&option,&c) == 0 || c != '\n'){
while((check = getchar()) != 0 && check != '\n' && check != EOF);
printf("\tI sayed a Number please\n\n");
}else{
if ( option < 1){
printf("Wrong input!\n");
}else{
break;
}
}
}while(1);
return option;
}
输出:
Please type a number: 1f
I sayed a Number please
Please type a number: f1
I sayed a Number please
Please type a number: -1
Wrong input!
Please type a number: 1
Your number is 1
答案 2 :(得分:1)
你不需要循环外的第一个提示,因为你已经将长度初始化为零,所以循环将至少提示一次。
在除Wndows以外的大多数平台上,您需要刷新标准输出以显示未以换行符终止的文本。
只要缓存换行符并且scanf
单独不会消耗换行符, %d
将返回,因此您需要确保刷新任何剩余字符(包括换行符)以防止无休止的循环。
最好从scanf()
检查返回值,因为即使转换失败,也无法保证不修改其参数。
目前尚不清楚为什么min
是一个变量,因为它是初始化但从未重新分配,但可能是最终程序中的情况?
#include <stdio.h>
int main( void )
{
int length = 0 ;
int min = 12 ;
int bottle = 0 ;
while( length <= 0 )
{
int converted = 0 ;
printf( "Enter length of his or her shower in minutes: " ) ;
fflush( stdout ) ;
converted = scanf( "%d", &length ) ;
if( converted != 1 )
{
length = 0 ;
}
while( (c = getchar()) != '\n' && c != EOF ) { } // flush line buffer
}
bottle = min * length ;
printf( "%d", bottle ) ;
return 0;
}
答案 3 :(得分:0)
int min = 0;
do {
printf("Enter minutes: ");
scanf("%i", &min);
} while(min <= 0);
//programs resumes after this.