0

如何在最初包含 C 中的小数的两部分中转换字符串或中断字符串。我必须逐位解析这个数字。

char s[] = "2.03";
// -->
double a = 2;
double b = 0.03;
4

3 回答 3

2

这是一个简单的方法吗?

#include <stdlib.h> /* you need this header for conversion functions */
char s[] = "2.03";
double a = (int)atoi(s);
double b = atof(s)-a;

好的。不使用简单函数(仅 pow 和 strlen 函数)。

#include <stdio.h>
#include <math.h>

int main()
{
  char s[] = "2.03";
  double a = 0,b = 0;
  int i,n = 0;
  char d = 0;
  for(i = 0; i < strlen(s); i++) /* don't want strlen? for(i = 0; s[i] != '\0'; i++) */
  {
    if(d == 1)
    {
      b += (s[i]-'0')/(pow(10,++n)); /* don't want pow? make the function w/ a loop */
    }
    else if(s[i] == '.')
      d = 1;
    else
    {
      a *= 10;
      a += s[i]-'0'; /* convert chars to numbers */
    }
  }
  printf("%f %f",a,b);
  return 0;
}
于 2012-10-24T01:37:19.670 回答
2

使用strtodmodf

#include <stdlib.h>
#include <math.h>

double d = strtod(s, NULL);
double a;
double b = modf(d, &a);
于 2012-10-24T01:38:01.450 回答
0

那么像下面的函数呢。

void makeTwoPieces (char *str, double *dMost, double *dLeast)
{
  double  dMultiplier;
  *dMost = *dLeast = 0.0;

  for (; *str; str++) {
    if (*str == '.') {
        break;
    } else if (*str >= '0' && *str <= '9') {
       *dMost *= 10;
       *dMost += (*str - '0');
    }
  }
  dMultiplier = 1.0;
  for (; *str; str++) {
    if (*str >= '0' && *str <= '9') {
       dMultiplier /= 10;
       *dLeast += (*str - '0') * dMultiplier;
    }
  }
}

然后您可以在测试工具中使用此功能,如下所示:

int main(int argc, char * argv[])
{
    double d1, d2;
    char *str = "2.03";
    makeTwoPieces (str, &d1, &d2);
    return 0;
}
于 2012-10-24T02:00:23.020 回答