2017-04-12 51 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感謝它的工作原理。 –