将char *中的字符替换为double值

时间:2015-07-12 00:10:17

标签: c string

我有一个char *,我需要将一个字符替换为double值(未知位数)。因此,我认为我需要计算数字位数,然后生成realloc()并替换字符。我只是不确定如何计算位数并制作此replacement

例如:

char *c = strdup("a+b");
double d = 10;
//I'd like to replace 'a' for 10.  
//then 'c' would be : 10+b. 
//Next iteration I need to change the 'b' value then I get:
//c = 10 + 3

2 个答案:

答案 0 :(得分:4)

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


int main(int argc, char **argv)
{
  const char* s = "a+b";
  double d = 10.23142;

  //determine the string length needed for printing d
  size_t n = snprintf(NULL, 0, "%g", d);
  // old string length + n - 1 for replaced b +  1 for '\0'        
  char* new_s = malloc( strlen(s) + n - 1 + 1); 

  //write the double
  sprintf(new_s, "%g", d);  

  //skip the first byte (where b is) at the source and the double's length at the destination
  strcpy(new_s + n, s + 1);     

  printf("%s\n", new_s); //prints 10.2314+b 

  free(new_s);
  return 0;
}

在这种指针算法中很容易产生一个一个错误,所以像gcc的mudflap或AddressSanitizer这样的东西在检查确保程序没有用的时候非常有用。在某个地方进入未定义的行为。

更好的是,如果可以的话,使用C ++并且您不必担心这类内容:

#include <iostream>
using namespace std;

int main(int argc, char **argv)
{
  string s = "a+b";
  double d = 10.23142;

  s.replace(0,1,to_string(d));
  cout<<s<<endl;

  return EXIT_SUCCESS;
}

答案 1 :(得分:3)

realloc的问题在于你可能不一定得到同一个地址,所以从技术上来说,你可能不会在创建新字符串时替换字符。

您可以通过将其打印到静态缓冲区并使用strlen:

来测量double的大小
char buf[32];
sprintf(buf, "%f", dbl);
size_t Len = strlen(buf);

Demo

现在您可以分配更多空间,将内容移到后面,然后将字符从buf复制到重新分配的空间。