2017-04-12 48 views
1

我正在写一个shell脚本,以取代sprintf的一个附加参数的snprintf中的snprintf是在一个单一的.cc文件的sizeof()的所有事件,替换snprintf的sprintf的额外参数

防爆 -

sprintf(temp1, "msg%d", hostid); 
sprintf(temp2, "msg%d", hostid); 
sprintf(temp3, "msg%d", hostid); 

要与

snprintf(temp1, sizeof(temp1), "msg%d", hostid); 
snprintf(temp2, sizeof(temp2), "msg%d", hostid); 
snprintf(temp3, sizeof(temp3), "msg%d", hostid); 

注取代:sprintf的第一参数在这个例子中,可以变化到sprintf的,它不是恒定的。

+2

如果第一个参数是一个指针怎么办? 'sizeof()'不会返回你认为它的作用。 –

+0

它是一个字符数组 –

+1

在您的完整代码库中? 100%确定?那么,去吧。提示:向我们展示你已经提出并改进的良好做法。 –

回答

0

我觉得这个命令将工作:

sed '[email protected](\([^,]*\),\([^,]*\),\([^,]*\));@snprintf(\1, sizeof(\1), \2, \3);@g' theCCfile.cc 

也许我错了,但我想的sizeof参数必须比第一sprintf参数不一样?如果不是,则取消sizeof(\1)通过sizeof(temp)

在此命令中,每个sprintf参数将被复制到新的snprintf行。如果要替换第sprintf行的第二个和/或第三个参数,而不是复制,请使用sed命令中的常量参数替换\2和/或\3

+0

这是我的第一个堆栈溢出问题,我在2-3分钟内得到了答案,@romaric crailox感谢它的工作原理。 –