如何连接字符串?
var str = 'asdf'
var b = str + 'sdf'
似乎不起作用..
我查阅了文档(https://github.com/ethereum/wiki/wiki/Solidity-Tutorial#elementary-types-value-types),并没有提到有关字符串连接的内容。 但据说它适用于点('。')?
"[...] a mapping key k is located at sha3(k . p) where . is concatenation."
对我来说也没有成功..:/
答案 0 :(得分:16)
您无法连接字符串。您还无法检查等号(str0 == str1
)。字符串类型最近刚刚添加回语言,所以它可能需要一段时间才能完成。你能做什么(他们最近添加的)是使用字符串作为映射的键。
您指向的串联是如何根据字段类型等计算存储地址,但这是由编译器处理的。
答案 1 :(得分:16)
可以使用library,例如:
import "github.com/Arachnid/solidity-stringutils/strings.sol";
contract C {
using strings for *;
string public s;
function foo(string s1, string s2) {
s = s1.toSlice().concat(s2.toSlice());
}
}
使用上面的quick test,您可以根据需要进行修改。
由于concatenating strings needs to be done manually for now,并且在合同中这样做可能会消耗不必要的气体(必须分配新的字符串然后写入每个字符),因此值得考虑需要字符串连接的用例是什么?
如果DApp可以以某种方式编写,以便前端连接字符串,然后将其传递给合同进行处理,这可能是更好的设计。
或者,如果合同想要散列单个长字符串,请注意Solidity(sha256
,ripemd160
,sha3
)中的所有内置散列函数都采用变量数字参数和将在计算哈希值之前执行连接。
答案 2 :(得分:10)
You have to do it manually for now
Solidity不提供内置字符串连接和字符串比较 但是,您可以找到实现字符串连接和比较的库和契约。
StringUtils.sol库实现了字符串比较 Oraclize contract srtConcat function实现字符串连接。
如果需要串联来获取结果字符串的哈希值,请注意Solidity中有内置哈希函数:sha256
,ripemd160
,sha3
。它们采用可变数量的参数并在计算哈希值之前执行连接。
答案 3 :(得分:7)
这是另一种在Solidity中连接字符串的方法。它也显示在tutorial:
中pragma solidity ^0.4.19;
library Strings {
function concat(string _base, string _value) internal returns (string) {
bytes memory _baseBytes = bytes(_base);
bytes memory _valueBytes = bytes(_value);
string memory _tmpValue = new string(_baseBytes.length + _valueBytes.length);
bytes memory _newValue = bytes(_tmpValue);
uint i;
uint j;
for(i=0; i<_baseBytes.length; i++) {
_newValue[j++] = _baseBytes[i];
}
for(i=0; i<_valueBytes.length; i++) {
_newValue[j++] = _valueBytes[i++];
}
return string(_newValue);
}
}
contract TestString {
using Strings for string;
function testConcat(string _base) returns (string) {
return _base.concat("_Peter");
}
}
答案 4 :(得分:1)
您可以利用abi.encodePacked
:
bytes memory b;
b = abi.encodePacked("hello");
b = abi.encodePacked(b, " world");
string memory s = string(b);
// s == "hello world"
答案 5 :(得分:0)
以上示例无法完美运行。 例如,尝试concat这些值
[“ 10”,“ 11”,“ 12”,“ 13”,“ 133”],您将获得[“ 1”,“ 1”,“ 1”,“ 1”,“ 13”] < / p>
有一些错误。
而且您也不需要使用库。因为图书馆非常庞大。
使用此方法:
function concat(string _a, string _b) constant returns (string){
bytes memory bytes_a = bytes(_a);
bytes memory bytes_b = bytes(_b);
string memory length_ab = new string(bytes_a.length + bytes_b.length);
bytes memory bytes_c = bytes(length_ab);
uint k = 0;
for (uint i = 0; i < bytes_a.length; i++) bytes_c[k++] = bytes_a[i];
for (i = 0; i < bytes_b.length; i++) bytes_c[k++] = bytes_b[i];
return string(bytes_c);
}
答案 6 :(得分:0)
我用这个方法来连接字符串。希望这对您有帮助
function cancat(string memory a, string memory b) public view returns(string memory){
return(string(abi.encodePacked(a,"/",b)));
}
答案 7 :(得分:0)
您可以使用 ABI 编码器执行此操作。 Solidity 不能自然地连接字符串,因为它们是动态调整大小的。您必须将它们散列到 32 字节。
pragma solidity 0.5.0;
pragma experimental ABIEncoderV2;
contract StringUtils {
function conc( string memory tex) public payable returns(string
memory result){
string memory _result = string(abi.encodePacked('-->', ": ", tex));
return _result;
}
}
答案 8 :(得分:-2)
Codewars在重复字符串时遇到了挑战,因此需要将字符串与自身连接n次到新字符串中。不完全相同,但其他人可能会发现它很有用。为了避免破坏他人的挑战(比如我自己),我将发布链接。显示了几种不同的解决方案。
https://www.codewars.com/kata/string-repeat/solutions?show-solutions=1