我尝试使用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 );
答案 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