Solidity
如何在 Solidity 中獲取字元串的預設值?
我有一個契約,需要檢查是否設置了 Struct 中的 String-Array 是否設置了映射。我找到了這個答案: 字元串的零值是多少? 我將我的字元串轉換為字節並檢查它是否不等於 0。
我也試過了。這是我的程式碼。
contract MyContract{ struct artist { string name; string[] songNames; } mapping(address => artist) artists; function checkDefaultValue() public view returns (uint256) { return bytes(artists[msg.sender].name).length; } }
我用松露編譯和遷移它,得到以下結果:
BN { negative: 0, words: [ 25535600, 45482263, 41138111, 21965320, 15007926, 53592304, 65526573, 9237065, 33654519, 3241105, <1 empty item> ], length: 10, red: null }
問題是,長度是 10。然後我用以下函式設置字元串:
function Upload(string memory _songName) public { artists[msg.sender].songNames.push(_songName); }
但是在我執行函式後,只有單詞發生了變化:checkDefaultValue()。長度還是10。
如果字元串是從特定地址設置的,我做錯了什麼或如何檢查?我想按照要求來做。不是如果。
不同的測試方法怎麼樣,返回什麼,這可能更容易。
檢查長度並返回真/假
這裡我只是傳入一個字元串或“”作為邏輯測試器
function isDefault(string memory _str) public pure returns (bool) { if(bytes(_str).length == 0) return true; return false; }
正如所寫的那樣,合約返回零(在 Remix 中嘗試),因此重點應該放在測試方法上。考慮將 BN 傳遞給以
.toString()
查看十進制值的無損表示。你可以為這個問題製作一個不錯的小純函式:
function isNull(string memory val) internal pure returns (bool) { return bytes(val).length == 0; }
然後用它來驗證輸入:
require(!isNull(inputStr), "input cannot be empty");
希望能幫助到你。