重新提示用户,直到 he/she 输入大于 1 的正整数值
Re-prompting a user until he/she enters a positive integer value greater than 1
我正在解决 CS50(问题集 1),即 water.c。它要求用户编写一个程序,提示用户以分钟为单位的淋浴时长(作为正整数),然后打印出等量的水瓶数(作为整数)。
淋浴 1 分钟 = 消耗 12 瓶
主要问题:问题是我们必须确保用户输入正数的分钟数,否则它会不断重新提示他返回 input/scanf 语句。只要他输入长度<=0,我就可以使用 while(length<=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;
}
int min = 0;
do {
printf("Enter minutes: ");
scanf("%i", &min);
} while(min <= 0);
//programs resumes after this.
您不需要循环外的第一个提示,因为您已经将长度初始化为零,因此循环至少会提示一次。
在 Wndows 以外的大多数平台上,您需要刷新标准输出以显示未以换行符结尾的文本。
scanf
将 return 只要一个换行符被缓冲并且 %d
单独不会消耗换行符,所以你需要确保任何剩余的字符直到并包括刷新换行符以防止无限循环。
最好检查 scanf()
中的 return 值,因为它不能保证即使转换失败也不修改其参数。
不清楚为什么 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;
}
你可以通过先读取一个字符串,然后提取任意数字来解决这个问题:
#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
中的 return 值,即成功转换的项目数。
如果您不关心像 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
我正在解决 CS50(问题集 1),即 water.c。它要求用户编写一个程序,提示用户以分钟为单位的淋浴时长(作为正整数),然后打印出等量的水瓶数(作为整数)。 淋浴 1 分钟 = 消耗 12 瓶 主要问题:问题是我们必须确保用户输入正数的分钟数,否则它会不断重新提示他返回 input/scanf 语句。只要他输入长度<=0,我就可以使用 while(length<=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;
}
int min = 0;
do {
printf("Enter minutes: ");
scanf("%i", &min);
} while(min <= 0);
//programs resumes after this.
您不需要循环外的第一个提示,因为您已经将长度初始化为零,因此循环至少会提示一次。
在 Wndows 以外的大多数平台上,您需要刷新标准输出以显示未以换行符结尾的文本。
scanf
将 return 只要一个换行符被缓冲并且 %d
单独不会消耗换行符,所以你需要确保任何剩余的字符直到并包括刷新换行符以防止无限循环。
最好检查 scanf()
中的 return 值,因为它不能保证即使转换失败也不修改其参数。
不清楚为什么 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;
}
你可以通过先读取一个字符串,然后提取任意数字来解决这个问题:
#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
中的 return 值,即成功转换的项目数。
如果您不关心像 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