2017-05-27 74 views
0

如果您的字符串如下所示 str="insert 111,name,123456789" 當您將它傳遞給strtok並嘗試打印值時,它們會反向輸出。 例如:strtok()作爲printf()中的一個參數反向打印值

char* token=strtok(str," "); 
printf("%s %s %s %s\n",token,strtok(NULL,","),strtok(NULL,","),strtok(NULL,",")); 
output: insert 1234567 name 1111 

代替:insert 111 name 123456789 這究竟是爲什麼?這怎麼解決?

+3

參數評估順序未定義。不要在參數中使用帶副作用的代碼(如調用'strtok')。 –

+1

由於參數評估的順序無法保證,因爲* sequence point *錯誤,您可能正在經歷* Indeterminently Sequenced *結果。 ** C11標準部分。 6.5.2.2(10)** –

+0

如何解決?通過使用慣用的'while(token!= NULL)'循環。你的版本也很糟糕,因爲如果其中一個'strtok'的調用應該返回NULL,你不應該再次調用它。永遠不要依賴於你認爲應該是的輸入數據。 –

回答

1

將參數按照調用約定順序推送到堆棧,這在您的情況下是反向的...因此參數5首先是評估並推入堆棧,然後是4,3,2和格式字符串。

儘可能多的評論建議,你的通話風格非常灰心, ,應該避免。

+0

而對於通過寄存器傳遞的'x86_64'參數 - 這是如何工作的? (你應該區分整數參數和其他所有參數) –