当你开始学习使用solidity开发以太坊智能合约之后,很快你会碰到一个问题:在solidity中该如何拼接字符串?

实验目的

1.掌握字符串拼接的两种方法。

2.了解storage与memory之间的赋值的传递类型。

实验要求

1、查看示例1中拼接字符串的操作是否成功?请自行创建一个新的合约测试一下并检查结果。

2、查看示例2 ,按要求补充好代码。在函数strConcat中:

①请你声明一个bytes类型的变量_bytea,存储类型为memory。再将传入的string类型参数_a转换为bytes类型赋值给_bytea。

②请你声明一个bytes类型的变量_byteb,存储类型为memory。再将传入的string类型参数_b转换为bytes类型赋值给_byteb。

③声明一个新的string类型变量ret,存储类型为memory,它的长度为_bytea的长度加上_byteb的长度。

④声明一个新的bytes类型变量bytesret,存储类型为memory。再将string类型的ret转换为bytes类型赋值给bytesret。

⑤定义一个uint类型的变量k。

⑥使用for循环遍历_bytea中的每一个字节赋值给bytesret,其中k为bytesret的赋值位置,每次赋值会进行加一操作。

⑦使用for循环遍历_byteb中的每一个字节赋值给bytesret,其中k为bytesret的赋值位置,每次赋值会进行加一操作。

⑧将ret转换为string类型,再进行返回。

补充完这八行代码后,请进行测试。调用函数strConcat,传入两个参数小明和小红。检查返回值是否为小明小红。思考第八步,为什么没有对变量ret赋值,还会有返回值?变量ret原本就是string类型,为什么还要重新转换为string类型进行返回?

3、查看示例3,请你尝试提示补充函数。使得该合约函数成功进行字符串拼接。

以下是本次所使用的测试代码,请使用remix编辑器完成该实验

//示例1:
var str = 'asdf';
var b = str + 'sdf'

//示例2:
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract stingTest {
    // 使用相加的运算符连接起来, 行吗??
    // string str = 'asdf';
    // string b = str + 'sdf';
    
    // 1、利用bytes和string之间的类型转换来实现字符串拼接
    function strConcat(string memory _a, string memory _b) public pure returns (string memory){
        //请你根据要求补充好代码
   }  
}

示例3:
// 2 使用第三方库
//可参考。。。。
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
import .......      //请你在此引用字符串拼接的第三方库
contract C {
    using strings for *;
    string public s;
 
    function foo(string s1, string s2) public returns (string memory) {
        s = s1.toSlice().concat(s2.toSlice());
        return s;
    }
}

下面是本实验配套的视频教程: