如何判断用户输入的值是否为double(C死循环问题,附示例代码)
How to check if the value entered by the user is double (C infinite loop problem,with example code)
我写了一个需要两个嵌套循环的代码,我试图创建一个控制机制来防止如果用户输入除了两个双变量之外的循环进入无限循环;但是例如,如果我输入一个字符,它将再次进入无限循环。我需要编辑哪一部分?(只要用户输入两个double变量就会起作用,如果用户输入不同的变量类型程序就会终止,但它并没有在下面的代码中结束,它进入了一个无限循环) edit1;感谢@EugeneSh 修复了这段代码的第一个问题(control==scanf("%lf %lf",&a,&b) 应该是(control=...)Iam controlling control and flag variable twice ,is there有什么办法可以做得更好吗?
编辑2;当我在 while(flag==1) 之后添加 if(control==2 &&flag==1) 这个表达式时,这段代码没有问题,问题就解决了。
int flag=1;
int control=2;
double a,b;
while(flag==1){
...
while(control==scanf("%lf %lf",&a,&b)){
if(control==2 &&flag==1){
....
break;
}
else{
flag =0 break;
}
}
}
假设您输入类似 c2. 的内容0Enter - 输入流将包含序列 {'c', '2', '.', '0', '\n'}
.
%lf
转换说明符告诉 scanf
读取并丢弃任何前导空格,然后读取下一个 不是 一部分的字符floating-point常数。它看到的第一个字符是 c
,它不是浮点常量的一部分,因此它会在该点停止读取。 a
和 b
未更新,'c'
字符 未 从输入流中删除,并且 scanf
returns 0
表示没有成功的转换或分配。
更好的是,如果你在良好的输入中嵌入了错误的输入 - 如果你输入 123c5
,scanf
将转换并将 123.0
分配给 a
,离开b
未修改,return 1
,而理想情况下您希望拒绝整个事情。
解决此问题的最佳方法是完全放弃 scanf
。相反,使用 fgets()
将输入读取为 text,并使用 strtod
将其转换。这样你就可以捕捉到错误的输入,而不会在输入流中留下垃圾:
#include <stdlib.h>
#include <string.h>
#define INPUT_SIZE 80
/**
* Reads the next two floating point inputs from the specified input stream.
* Returns the number of valid inputs read and assigned.
*/
int get_inputs( double *x, double *y, FILE *stream )
{
char input[INPUT_SIZE];
double *ptr[2] = {x, y};
size_t i;
/**
* Read the next line from the input stream - if there's an error,
* we return 0.
*/
if ( !fgets( input, sizeof input, stream ) )
return 0;
/**
* Otherwise, split the input into whitespace-separated tokens,
* then try to convert each token to a double using strtod.
*/
char *tok = strtok( input, " \t\n\f" );
for ( i = 0; i < 2; i++ )
{
char *chk;
/**
* After calling strtod, chk will point to the first character
* that is not part of a valid floating-point constant. If this
* character is not whitespace or 0, then the input is bad and
* we break out of the loop.
*/
double tmp = strtod( tok, char &chk );
if ( !isspace( chk ) && *chk != 0 )
break;
/**
* Write this double value to the appropriate argument - ptr[0]
* corresponds to x, ptr[1] corresponds to y.
*/
*ptr[i] = tmp;
/**
* Get the next token in the sequence:
*/
tok = strtok( NULL, " \t\n\f" );
}
return i;
}
我写了一个需要两个嵌套循环的代码,我试图创建一个控制机制来防止如果用户输入除了两个双变量之外的循环进入无限循环;但是例如,如果我输入一个字符,它将再次进入无限循环。我需要编辑哪一部分?(只要用户输入两个double变量就会起作用,如果用户输入不同的变量类型程序就会终止,但它并没有在下面的代码中结束,它进入了一个无限循环) edit1;感谢@EugeneSh 修复了这段代码的第一个问题(control==scanf("%lf %lf",&a,&b) 应该是(control=...)Iam controlling control and flag variable twice ,is there有什么办法可以做得更好吗? 编辑2;当我在 while(flag==1) 之后添加 if(control==2 &&flag==1) 这个表达式时,这段代码没有问题,问题就解决了。
int flag=1;
int control=2;
double a,b;
while(flag==1){
...
while(control==scanf("%lf %lf",&a,&b)){
if(control==2 &&flag==1){
....
break;
}
else{
flag =0 break;
}
}
}
假设您输入类似 c2. 的内容0Enter - 输入流将包含序列 {'c', '2', '.', '0', '\n'}
.
%lf
转换说明符告诉 scanf
读取并丢弃任何前导空格,然后读取下一个 不是 一部分的字符floating-point常数。它看到的第一个字符是 c
,它不是浮点常量的一部分,因此它会在该点停止读取。 a
和 b
未更新,'c'
字符 未 从输入流中删除,并且 scanf
returns 0
表示没有成功的转换或分配。
更好的是,如果你在良好的输入中嵌入了错误的输入 - 如果你输入 123c5
,scanf
将转换并将 123.0
分配给 a
,离开b
未修改,return 1
,而理想情况下您希望拒绝整个事情。
解决此问题的最佳方法是完全放弃 scanf
。相反,使用 fgets()
将输入读取为 text,并使用 strtod
将其转换。这样你就可以捕捉到错误的输入,而不会在输入流中留下垃圾:
#include <stdlib.h>
#include <string.h>
#define INPUT_SIZE 80
/**
* Reads the next two floating point inputs from the specified input stream.
* Returns the number of valid inputs read and assigned.
*/
int get_inputs( double *x, double *y, FILE *stream )
{
char input[INPUT_SIZE];
double *ptr[2] = {x, y};
size_t i;
/**
* Read the next line from the input stream - if there's an error,
* we return 0.
*/
if ( !fgets( input, sizeof input, stream ) )
return 0;
/**
* Otherwise, split the input into whitespace-separated tokens,
* then try to convert each token to a double using strtod.
*/
char *tok = strtok( input, " \t\n\f" );
for ( i = 0; i < 2; i++ )
{
char *chk;
/**
* After calling strtod, chk will point to the first character
* that is not part of a valid floating-point constant. If this
* character is not whitespace or 0, then the input is bad and
* we break out of the loop.
*/
double tmp = strtod( tok, char &chk );
if ( !isspace( chk ) && *chk != 0 )
break;
/**
* Write this double value to the appropriate argument - ptr[0]
* corresponds to x, ptr[1] corresponds to y.
*/
*ptr[i] = tmp;
/**
* Get the next token in the sequence:
*/
tok = strtok( NULL, " \t\n\f" );
}
return i;
}