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