Solidity

如何在 Solidity 中獲取字元串的預設值?

  • July 8, 2022

我有一個契約,需要檢查是否設置了 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");

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/131358