当你开始学习使用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;
}
}
下面是本实验配套的视频教程:
