C 如何在while循环中转换这个goto循环?
我有一个程序,提示用户输入三个浮点数,如果这些数字不是正数或不是数字,它会打印出“无效数字”这是程序中使用C 如何在while循环中转换这个goto循环?,c,while-loop,goto,C,While Loop,Goto,我有一个程序,提示用户输入三个浮点数,如果这些数字不是正数或不是数字,它会打印出“无效数字”这是程序中使用goto循环完成的部分,我想去掉它 float array[n][3]; int i; for(i = 0;i<n;i++){ one: printf( "Please enter first number: "); scanf("%f", &array[i][0]); while(array[i][0]<0){ print
goto
循环完成的部分,我想去掉它
float array[n][3];
int i;
for(i = 0;i<n;i++){
one:
printf( "Please enter first number: ");
scanf("%f", &array[i][0]);
while(array[i][0]<0){
printf("Invalid number: ");
goto one;
}
two:
printf("Please enter second number: ");
scanf("%f", &array[i][1]);
while(array[i][1]<0){
printf("Invalid number: ");
goto two;
}
three:
printf("Please enter third number: ");
scanf("%f", &array[i][2]);
while(array[i][1]<0){
printf("Invalid number: ");
goto three;
}
}
float数组[n][3];
int i;
对于(i=0;i请参见我的更改。我不仅修改了goto
案例:
double array[n][3];
int i, j;
char * fst[] = { "first", "second", "third" };
for( i = 0; i < n; i++ )
{
for ( j = 0; j < 3; j++ )
{
while ( 1 )
{
printf( "Please enter %s number: ", fst[j] );
scanf( "%lf", &array[i][j] );
if ( array[i][j] < 0 )
printf("Invalid number.\n");
else break;
}
}
}
双数组[n][3];
int i,j;
char*fst[]={“第一”、“第二”、“第三”};
对于(i=0;i
类似的块与循环和字数组组合。double
比float
好,除非RAM非常低(嵌入式系统)。goto
被转换为,而循环和中断
。我想你说的是“无效数字”对于负数,不失败scanf
。如果检查失败scanf
,则可以将其修改为If(scanf(“%lf”),&array[i][j])<1).
请参见我的更改。我不仅修改了转到案例:
double array[n][3];
int i, j;
char * fst[] = { "first", "second", "third" };
for( i = 0; i < n; i++ )
{
for ( j = 0; j < 3; j++ )
{
while ( 1 )
{
printf( "Please enter %s number: ", fst[j] );
scanf( "%lf", &array[i][j] );
if ( array[i][j] < 0 )
printf("Invalid number.\n");
else break;
}
}
}
双数组[n][3];
int i,j;
char*fst[]={“第一”、“第二”、“第三”};
对于(i=0;i
类似的块与循环和字数组组合。double
比float
好,除非RAM非常低(嵌入式系统)。goto
被转换为,而循环和中断
。我想你说的是“无效数字”对于负数,不失败scanf
。如果检查失败scanf
,则可以将其修改为If(scanf(“%lf”,&array[i][j])<1).
您可以将其转换为do{…}而(…);
例如:
one:
printf( "Please enter first number: ");
scanf("%f", &array[i][0]);
while(array[i][0]<0){
printf("Invalid number: ");
goto one;
}
1:
printf(“请输入第一个数字:”);
scanf(“%f”和数组[i][0]);
while(数组[i][0]您可以将其转换为do{…}while(…);
例如:
one:
printf( "Please enter first number: ");
scanf("%f", &array[i][0]);
while(array[i][0]<0){
printf("Invalid number: ");
goto one;
}
1:
printf(“请输入第一个数字:”);
scanf(“%f”和数组[i][0]);
而(数组[i][0]您可以像
for(i = 0;i<n;i++){
while(printf( "Please enter first number: ")>0 && scanf("%f", &array[i][0])==1 && array[i][0]<0 && printf("Invalid number: ") );
while(printf( "Please enter second number: ")>0 && scanf("%f", &array[i][1])==1 && array[i][1]<0 && printf("Invalid number: "));
while(printf( "Please enter third number: ")>0 && scanf("%f", &array[i][2])==1 && array[i][2]<0 && printf("Invalid number: ") );
}
让它更具可读性
编辑:
如果输入不是有效的数字,scanf()
将不会读入变量,因为格式说明符是%f
这可能会导致问题,因为无效输入将在输入缓冲区中保持未使用状态。您需要清除输入缓冲区
差不多
int ch;
while( (ch=getch())!=EOF && ch!='\n' );
可能用于从输入缓冲区到换行符的消耗。有关更多信息,请参阅
返回出错时的EOF
。请注意getchar()
返回转换为int的无符号字符
要包括这一点,您可以将那些while
循环修改为
int ch;
while(printf( "Please enter third number: ")>0 && scanf("%f", &array[i][2])==1 && array[i][2]<0)
{
printf("Invalid number: ")
while( (ch=getch())!=EOF && ch!='\n' );
}
intch;
而(printf(“请输入第三个数字:”)>0&&scanf(“%f”,&array[i][2])==1&&array[i][2]您可以这样做
for(i = 0;i<n;i++){
while(printf( "Please enter first number: ")>0 && scanf("%f", &array[i][0])==1 && array[i][0]<0 && printf("Invalid number: ") );
while(printf( "Please enter second number: ")>0 && scanf("%f", &array[i][1])==1 && array[i][1]<0 && printf("Invalid number: "));
while(printf( "Please enter third number: ")>0 && scanf("%f", &array[i][2])==1 && array[i][2]<0 && printf("Invalid number: ") );
}
让它更具可读性
编辑:
如果输入不是有效的数字,scanf()
将不会读入变量,因为格式说明符是%f
这可能会导致问题,因为无效输入将在输入缓冲区中保持未使用状态。您需要清除输入缓冲区
差不多
int ch;
while( (ch=getch())!=EOF && ch!='\n' );
可能用于从输入缓冲区到换行符的消耗。有关更多信息,请参阅
返回出错时的EOF
。请注意getchar()
返回转换为int的无符号字符
要包括这一点,您可以将那些while
循环修改为
int ch;
while(printf( "Please enter third number: ")>0 && scanf("%f", &array[i][2])==1 && array[i][2]<0)
{
printf("Invalid number: ")
while( (ch=getch())!=EOF && ch!='\n' );
}
intch;
而(printf(“请输入第三个数字:”)>0&&scanf(“%f”、&array[i][2])==1&&array[i][2]避免goto
通常是一个好主意(即使存在一些可接受的用法)。要避免的其他事项:
- 代码重复。(危险)
- 在值有效之前将值存储到最终数据容器中。(危险)
- 迭代二维数组的最左维度而不是最右维度。(效率低下)
解决上述所有问题的一种可能解决方案:
#include <stdio.h>
float enter_float (size_t n)
{
const char* STR_NUMBER[] = { "first", "second", "third" };
float result;
printf("Please enter %s number: ", STR_NUMBER[n]);
scanf("%f", &result);
return result;
}
int main (void)
{
size_t n=3;
float array[n];
for(size_t i=0; i<n; i++)
{
float input;
while( (input = enter_float(i)) < 0.0f)
{
printf("Invalid number\n");
}
array[i] = input;
}
}
#包括
浮动输入浮动(大小)
{
const char*STR_NUMBER[]={“第一”、“第二”、“第三”};
浮动结果;
printf(“请输入%s编号:”,STR_编号[n]);
scanf(“%f”,和结果);
返回结果;
}
内部主(空)
{
尺寸n=3;
浮点数组[n];
对于(size_t i=0;i避免goto
通常是个好主意(即使存在一些可接受的用法)。其他要避免的事情:
- 代码重复。(危险)
- 在值有效之前将值存储到最终数据容器中。(危险)
- 迭代二维数组的最左维度而不是最右维度。(效率低下)
解决上述所有问题的一种可能解决方案:
#include <stdio.h>
float enter_float (size_t n)
{
const char* STR_NUMBER[] = { "first", "second", "third" };
float result;
printf("Please enter %s number: ", STR_NUMBER[n]);
scanf("%f", &result);
return result;
}
int main (void)
{
size_t n=3;
float array[n];
for(size_t i=0; i<n; i++)
{
float input;
while( (input = enter_float(i)) < 0.0f)
{
printf("Invalid number\n");
}
array[i] = input;
}
}
#包括
浮动输入浮动(大小)
{
const char*STR_NUMBER[]={“第一”、“第二”、“第三”};
浮动结果;
printf(“请输入%s编号:”,STR_编号[n]);
scanf(“%f”,和结果);
返回结果;
}
内部主(空)
{
尺寸n=3;
浮点数组[n];
对于(size_t i=0;i您是如何尝试的?请展示您迄今为止的研究/调试工作。请先阅读第页。您可以将其转换为do{…}while()
循环并将printf/scanf放入其中。例如,检查scanf
的返回值。我绕过它,为它编写了另一个完整的程序,在主函数中有一个外部函数和一个for函数,因为我不知道如何将其转换为di