我有一个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
答案 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);
现在您可以分配更多空间,将内容移到后面,然后将字符从buf复制到重新分配的空间。