为什么我不能使用printf格式替换字符串中的子字符串?

时间:2014-03-12 14:25:37

标签: c replace printf

我尝试使用printf家庭功能替换/替换较大字符串中的子字符串,但不知道它为什么不起作用。

uint64_t end = 100000;
char *bigchar = "This is a try $TIME_ELAPSED to replace using sprintf";
char *pPos = strstr(bigchar, "$TIME_ELAPSED");
sprintf(pPos, " %7ld ms. ", end);

但我在sprintf行中遇到了分段错误(memcpy失败),$TIME_ELAPSED%7ld ms.都有13个字符长度。

此外,使用此更改sprintf也会导致分段错误。

sprintf(bigchar, "%.*s% 7ld ms. %s", (int)(pPos-bigchar), bigchar, end, pPos+13 );

2 个答案:

答案 0 :(得分:4)

pPos指向bigchar缓冲区中的某个位置,此缓冲区是只读的,因为它包含字符串文字。在sprintf调用中,您尝试修改此只读缓冲区。

答案 1 :(得分:1)

char *s="Hai how are you!";

字符串文字始终存储在只读存储器中。

任何改变这种情况的尝试都会导致分段错误。

s[4]='q'; // This gives seg fault

但你可以这样做

char *bigchar = "This is a try $TIME_ELAPSED to replace using sprintf";
char temp[100];
strcpy(temp,bigchar );
char *pPos = strstr(temp, "$TIME_ELAPSED");
sprintf(pPos, " %7ld ms. ", end) can