Solidity 中的字符串数组

String array in solidity

我遇到了一个很常见的问题,似乎我无法在 solidity 中优雅高效地解决。

我必须将任意长字符串的任意长数组传递给 solidity 合约。

在我看来应该是这样的

function setStrings(string [] row)

但好像做不到

我该如何解决这个问题?

这是 Solidity 的一个限制,原因是 string 基本上是一个任意长度的字节数组(即 byte[]),所以 string[] 是一个双-维字节数组(即 byte[][])。根据Solidity references,暂不支持二维数组作为参数

Can a contract function accept a two-dimensional array?

This is not yet implemented for external calls and dynamic arrays - you can only use one level of dynamic arrays.

解决此问题的一种方法是,如果您预先知道所有字符串的最大长度(在大多数情况下是可能的),那么您可以这样做:

function setStrings(byte[MAX_LENGTH][] row) {...}

Solidity 尚不支持字符串数组作为参数。

您可以将数组元素转换为字节字符串,然后将该字节字符串反序列化回函数内的数组。虽然这可能会证明非常昂贵,但如果您别无选择,您可以尝试一下。您可以按照 this 短文 serialize/deserialize solidity 中的任何数据类型。

字符串数组在 Solidity 中不可用 因为 String 基本上是字符数组 未实现嵌套动态数组

solidity中有两种类型的数组:静态数组和动态数组。

数组声明

静态数组:这些具有固定大小。

int[5] list_of_students;
list_of_students = ["Faisal","Asad","Naeem"];

我们使用索引号

访问值

动态数组:这些数组的大小动态增加或减少。

int[] list_of_students;
list_of_students.push("Faisal");
list_of_students.push("Asad");
list_of_students.push("Smith");

我们可以使用索引号访问该值。 pushpop 函数用于插入和删除值。 length函数用于测量数组的长度。

可以使用 pragma experimental ABIEncoderV2; 在合同的顶部,您可以使用动态字符串数组。前任。 string[] memory myStrings;

2021 年 12 月更新

自 Solidity 0.8.0 起,默认使用 ABIEncoderV2,它为动态字符串数组提供本机支持。

pragma solidity ^0.8.0;

contract Test {
    string[] public row;

    function getRow() public view returns (string[] memory) {
        return row;
    }

    function pushToRow(string memory newValue) public {
        row.push(newValue);
    }
}

您需要的所有解决方案:-

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;

contract HelloWorld {
    string[] strings;

    // push one string to array
    function pushToStrings(string memory _data) public{
        strings.push(_data);
    }
    
    //get all the strings in array form
    function GetAllStrings() view public returns(string[] memory){
        return strings;
    }

    //get nth string of strings array
    function GetNthStrings(uint x) view public returns(string memory){
        return strings[x];
    }

    //push array of strings in strings
    function pushStringsArray(string[] memory someData) public{
        for (uint i=0; i < someData.length; i++) {
           strings.push(someData[i]);
        }
    }
    
    //change whole strings, take array of strings as input
    function changeWholeString(string[] memory someData) public{
       strings=someData;

    }
}

这是管理数组 pushgetgetAll 的示例合约 和 remove

pragma solidity ^0.8.4;

contract Array {
  string[] private fruits = ["banana", "apple", "avocado", "pineapple", "grapes"];

  function push(string memory item) public {
    fruits.push(item);
  }

  function get(uint256 index) public view returns (string memory) {
    return fruits[index];
  }

  function remove(uint256 index) public returns (bool) {
    if (index >= 0 && index < fruits.length) {
      fruits[index] = fruits[fruits.length - 1];
      fruits.pop();
      return true;
    }
    revert("index out of bounds");
  }

  function getAll() public view returns (string[] memory) {
    return fruits;
  }
}