如何检查科学记数法是不是加倍C++

Posted

技术标签:

【中文标题】如何检查科学记数法是不是加倍C++【英文标题】:How to check if scientific notation double or not C++如何检查科学记数法是否加倍C++ 【发布时间】:2014-12-12 22:14:50 【问题描述】:

我基本上想检查 line 是否是有效的科学替身。

所以基本上,如果一行有一个像 a 这样的字符,或者只有几个像 help0.a 这样的字符,那么它将被认为不是科学双精度并被拒绝,但是像 1.234E+9 或 @ 这样的字符987654327@ 将被存储,因为它是一个可接受的值

我已经编写了一些代码来处理这个问题,但是我需要一些帮助...区分科学替身和一些字符

char *temp;
int u=0;
int arrayLen = strlen(temp);
for(int i=0; i<len; i++)

  if(isalpha(temp[i]))
  
    if((temp[i] == 'e') && (!isalpha(temp[i-1])))
    
      break;
    
    u++;
  


if(u > 0)

   temp[0] = 0;
   break;

【问题讨论】:

使用 std::stod 或其 C 等效项 (strtod)。 你有可能使用正则表达式吗?那么它是一个单线。 @T.C. errr - 或者只是 咳嗽 太棒了。太容易了。 :-D 如何使用std::istringstream 并使用适当的I/O manipulators? @T.C.如何在我的代码中使用 strtod? 【参考方案1】:

作为 T.C.建议,使用 strtod。但是检查返回指针,看它是否读取了所有内容。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

double convert_number( const char * num )

   char * endptr = 0;
   double retval;
   retval = strtod( num, &endptr );
   return ( !endptr || ( *endptr != '\0' ) ) ? 0 : retval;



int main( int argc, char ** argv )

    int index;
    for( index = 0; index < argc; ++index )
        printf( "%30s --> %f\n", argv[index], convert_number( argv[index] ) );
    return 0;

例子:

./a.out 13.2425 99993.3131.1134  13111.34e313e2  1313e4 1 324.3 "2242e+3"
                       ./a.out --> 0.000000
                       13.2425 --> 13.242500
               99993.3131.1134 --> 0.000000
                13111.34e313e2 --> 0.000000
                        1313e4 --> 13130000.000000
                             1 --> 1.000000
                         324.3 --> 324.300000
                       2242e+3 --> 2242000.000000

--------每个请求的替代方案 ------------------------ ----

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int convert_number( const char * num, double * retval )

   char * endptr = 0;
   *retval = strtod( num, &endptr );
   return ( !endptr || ( *endptr != '\0' ) ) ? 0 : 1;



int main( int argc, char ** argv )

    int index;
    double dvalue;
    for( index = 0; index < argc; ++index )
        if( convert_number( argv[index], &dvalue ) )
            printf( "%30s --> %f\n", argv[index], dvalue );
        else
            printf( "%30s --> Rejected\n", argv[index], dvalue );
    return 0;

结果:

./a.out 13.2425 99993.3131.1134  13111.34e313e2  1313e4 1 324.3 "2242e+3" 0.0
                       ./a.out --> Rejected
                       13.2425 --> 13.242500
               99993.3131.1134 --> Rejected
                13111.34e313e2 --> Rejected
                        1313e4 --> 13130000.000000
                             1 --> 1.000000
                         324.3 --> 324.300000
                       2242e+3 --> 2242000.000000
                           0.0 --> 0.000000

新手版:

int convert_number( const char * num, double * retval )

   char * endptr = 0; /* Prepare a pointer for strtod to inform us where it ended extracting the double from the string. */
   *retval = strtod( num, &endptr );  /* Run the extraction of the double from the source string (num) and give us the value so we can store it in the address given by the caller (retain the position in the string where strtod stopped processing). */
   if( endptr == NULL )
       return 0;  /* endptr should never be NULL, but it is a defensive programming to prevent dereferencing null in the next statement. */
   else if( *endptr != '\0 ) /* If we are pointing to a non-null character, then there was an invalid character that strtod did not accept and stopped processing.  So it is not only a double on the line.  So we reject. */
       return 0; /* Not strictly the double we are looking for. */ 
   /* else */
   return 1;  /* Return 1 to the caller to indicate truth (non-zero) that the value in *retval has valid double value to use. */

【讨论】:

谢谢,我在想,有没有办法拒绝字符,因为0.0 是一个有效的双精度。目前字符串被转换为一个双精度,它给出0.000,它在不应该是有效的时候是有效的 详细说明您的标准。你是说 0.0 是无效的双精度数吗? 感谢您的回答和回复。基本上,我想存储像 0.0 这样的双精度而不是像 a./a.out 这样的字符。问题是这些字符被转换为双精度并产生0.00000,因此它们成为有效的双精度。总而言之,我不想读取任何字符并存储它们。我希望程序立即将它们识别为字符,而不是有效的科学双精度或只是双精度 研究代码示例。 if( !endptr || ( *endptr != '\0' ) ) 拒绝();否则使用(retval); 如果您不介意更改您的代码,请您帮忙。我还是不太同意你,但我只是想拒绝字符或不被视为doublescientific notation double的东西

以上是关于如何检查科学记数法是不是加倍C++的主要内容,如果未能解决你的问题,请参考以下文章

我如何知道字符串是不是是科学计数法中的数字?

如何在 C++ 中正确定义包含科学记数法的整数向量?

使用 C++ 为科学 Linux 安装 Eclipse

DevCloud让代码检查更科学

DevCloud让代码检查更科学

在 C++ 中将科学计数法转换为十进制