检查输入字符串是否是C中的实数

时间:2017-05-27 16:09:38

标签: c

在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;
}

2 个答案:

答案 0 :(得分:1)

您需要定义121e23是否为您的双倍。那么-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;
}