2017-05-27 117 views
-3

C有没有一种优雅的方式来检查给定的字符串是否是“双”? 如果变量的类型是double,但是如果字符串包含实数,则不适用。 例如:检查一个输入字符串是否是一个实数C

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; 
} 
+3

你可以使用['strtod'(http://en.cppreference.com/w/c/string/byte/strtof)并查看它是否可以转换完整的字符串。 –

+1

https://stackoverflow.com/a/456314/971127 – BLUEPIXY

+1

顺便提一句,'fgets(input,sizeof(input)-1,stdin);'比scanf(“%s”,输入)要好;' –

回答

1

您需要定义如果121e23是你双打。那么-4z12.3,?因此,请说明什么是可接受的和禁止的输入(提示:在纸上使用EBNF可能会有所帮助)。


注意strtod可以使用,并且可以给指针到最后解析字符。

所以

char* endp=NULL; 
double x = strtod(input, &endp); 
if (*endp == 0) { // parsed a number 

而且sscanf(你需要包括<stdio.h>)返回扫描的项目数,并接受%n(加入#include <stdlib.h>靠近你的文件的开头....之后)给出当前的字节偏移量。

int pos= 0; 
double x = 0.0; 
if (sscanf(input, "%f%n", &x, &pos)>=1 && pos>0) { // parsed a number 

您也可以使用正则表达式(regcomp(3) & regexec(3) ...)或parse您手动

串留作练习。

PS。请仔细阅读链接的文件。

+0

试图使用'strtod',但对于一些原因我得到'x = -var-create:无法在调试器中创建变量对象..“ – Avishay28

+0

我不明白上面的评论。你的*编译器*抱怨吗?什么是'var'或'create'? –

+0

编译器没问题,得到'strtod'结果的变量设置不正确。我从调试器得到这个消息。 – Avishay28

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; 
} 
+0

考虑替换'if(num_periods == 0){num_periods = 1; } else返回false;'用'if(num_periods ++!= 0)返回false;'。它更紧凑 - 但不会改变功能。目前,该代码在数字之前不处理标志。你明确地说你不处理指数。 –

相关问题