在C中是否有一种优雅的方式来检查给定的字符串是否为" double"? 如果变量的类型是double,但是如果字符串包含实数,则不是。 例如:
char input[50];
printf("please enter a real number: \n");
scanf("%s", input);
if ( is_double(input) ) {
//user entered "2"
return true;
//user entered "2.5"
return true;
//user entered "83.5321"
return true;
//user entered "w"
return false;
//user entered "hello world"
return false;
}
答案 0 :(得分:1)
您需要定义12
或1e23
是否为您的双倍。那么-4z
还是12.3,
呢?因此,指定可接受和禁止的输入(提示:在纸上使用EBNF可能会有所帮助)。
请注意,strtod可以使用,并且可以指向最后解析的字符。
所以(在文件开头附近添加#include <stdlib.h>
之后......)
char* endp=NULL;
double x = strtod(input, &endp);
if (*endp == 0) { // parsed a number
同样sscanf(您需要包含<stdio.h>
)会返回已扫描项目的数量,并接受%n
以提供当前字节偏移量。
int pos= 0;
double x = 0.0;
if (sscanf(input, "%f%n", &x, &pos)>=1 && pos>0) { // parsed a number
您也可以手动使用regexp(regcomp(3) & regexec(3) ...)或parse字符串
离开时练习。
PS。请仔细阅读链接的文件。
答案 1 :(得分:1)
只要你不允许科学记谱法:
#include <ctype.h>
#include <string.h>
#include <stdbool.h>
bool is_double(const char *input)
{
unsigned long length = strlen(input);
int num_periods = 0;
int num_digits = 0;
for (unsigned int i = 0; i < length; i++)
{
if ( i == 0 )
{
if ( input[i] == '-' || input[i] == '+' )
continue;
}
if ( input[i] == '.' )
{
if ( ++num_periods > 1 ) return false;
}
else
{
if (isdigit(input[i]))
{
num_digits++;
}
else
return false;
}
} /* end for loop */
if ( num_digits == 0 )
return false;
else
return true;
}