c - 如何处理从复杂输入(字符串)中提取 double 类型的数字

标签 c arrays string pointers input

<分区>

大家好,

我是 C 编程的新手,我偶然发现了一个问题,几天来我一直在努力解决这个问题,但仍然没有令人满意的结果。

我正在尝试提取一些 double以这种形式输入的用户值 {[ 5.1 ; 4 ], [15.3 ; -3.2] } .我尝试了很多方法,到目前为止最好的方法是我使用 fgets() 将用户输入读取为字符串。 , 遍历for如果isdigit()看到一个数字我将它存储在另一个字符串中,然后我检查该数字后面是否有一个点,如果有则我将它放在该数字后面的字符串中,依此类推。

真正的问题是当我想输出结果字符串并将其转换为我想要的 double 时与 strtod()它仅在用户首先输入一些数字时有效,但如果输入看起来像 { [ 2.5 ; 1 ] }代码只是不关心并且什么都不做。任何帮助或见解将不胜感激,也许我采取了错误的方法?谢谢。

我的代码

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

#define STR_LEN 256

int main() {

char t1[STR_LEN], digits[STR_LEN], *dpt, per[2] = ".";
int i, digit, period;
double x;

fgets(t1, STR_LEN, stdin);

for (i = 0; i < strlen(t1); i++) {
    digit = isdigit(t1[i]);
    period = (t1[i + 1] == '.') ? 1 : 0;
    if (digit) {
        digits[i] = t1[i];
    }
    if (period == 1) {
        strcpy(digits, digits);
        strcat(digits, per);
    }
}
x = strtod(digits, &dpt);
int testOutput = strlen(digits);
printf("%s %d %lf", digits, testOutput, x);

return 0;
}

最佳答案

试试这个:

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

struct Pair {
   double first;
   double second;
   struct Pair * tail;
};

void printPairs( const struct Pair * node ) {
   if( node->tail ) {
      printPairs( node->tail );
   }
   printf( "[ %3.2f ; %3.2f ]\n", node->first, node->second );
}

int main() {
   const char *  input = "some words before {[ 5.1 ; 4 ], [15.3 ; -3.2] } some words after";
   struct Pair * head  = NULL, * p = NULL;
   char * err   = NULL;
   double first, second;
   const char * s = strchr( input, '{' );
   while( s ) {
      s = strchr( s, '[' );
      if( ! s ) {
         break;
      }
      while( *s == ' ' || *s == '[' ) {
         ++s;
      }
      first = strtod( s, &err );
      if( err && ( *err == ' ' || *err == ';' )) {
         s = err + 1;
         while( *s == ' ' || *s == ';' ) {
            ++s;
         }
         second = strtod( s, &err );
         if( err && ( *err == ' ' || *err == ']' )) {
            p = (struct Pair *)calloc( 1, sizeof( struct Pair ));
            p->first  = first;
            p->second = second;
            p->tail   = head;
            head = p;
         }
         else {
            fprintf( stderr, "Parse error, space or ']' expected\n" );
            exit( EXIT_FAILURE );
         }
      }
      else {
         fprintf( stderr, "Parse error, space or ';' expected\n" );
         exit( EXIT_FAILURE );
      }
   }
   printPairs( head );
}

输出:

[ 5.10 ; 4.00 ]
[ 15.30 ; -3.20 ]

关于c - 如何处理从复杂输入(字符串)中提取 double 类型的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53144998/

相关文章:

c++ - 从 Swift 调用 C++ 代码是否比调用 C 代码更 "expensive"或者更慢?

javascript - 元胞自动机的相邻单元格计数

python - 在列的列表中搜索项目并将该项目保存到新列

java - 从一个类的数组中获取另一类的值

c++ - 在包含数组中存在的所有元素的数组中找到最短的范围

python - 在python中查找单词结尾的索引

java - 如何在 Java 中比较字符串?

c++ - CMD 异常处理 C/C++

c - 如何使用动态分配代替静态int?

c - 用任意数初始化指针