String
為什麼 remix 不允許在此程式碼中輸入字母?
好的,所以這段程式碼實際上被設計為在輸入除 0、1、…9 之外的任何內容時恢復,但讓我解釋一下。
我為一般實踐創建了此程式碼。它可能沒有實際用途,但它的目的是將數字 0 - 9 的字元串版本轉換為 uint 版本。在測試它時,當我輸入任何帶有字元 0 - 9 的字元串時,它都能正常工作。
pragma solidity ^0.4.24; contract ConvertStringToUint { // This version does not limit the number of bytes in the string to 78. function stringToUint(string _number) public pure returns(uint) { bytes memory strBytes = bytes(_number); uint i; uint digit; uint result; for (i = 0; i < strBytes.length; i++) { if (strBytes[i] == byte(48)) { digit = 0; } else if (strBytes[i] == byte(49)) { digit = 1; } else if (strBytes[i] == byte(50)) { digit = 2; } else if (strBytes[i] == byte(51)) { digit = 3; } else if (strBytes[i] == byte(52)) { digit = 4; } else if (strBytes[i] == byte(53)) { digit = 5; } else if (strBytes[i] == byte(54)) { digit = 6; } else if (strBytes[i] == byte(55)) { digit = 7; } else if (strBytes[i] == byte(56)) { digit = 8; } else if (strBytes[i] == byte(57)) { digit = 9; } else { revert(); } result = result * 10 + digit; } return result; } }
但是,當我添加一個字母或任何其他字元時,我收到了一個我沒想到的錯誤。
例如,如果我輸入字元串“324”,它會返回 uint“324”。但是如果我輸入字元串“3a24”,我會得到錯誤:
錯誤編碼參數:SyntaxError:位置 2 處 JSON 中的意外標記 a
這表明它甚至不允許我首先將這些字元作為字元串輸入,我不明白,因為輸入參數是字元串。
為了進一步測試這一點,我將行更改
else if (strBytes[i] == byte(49))
為else if (strBytes[i] == byte(97))
,因此現在字元“a”會將數字設置為 0,而字元“0”應該會導致錯誤。果然,輸入“0”給了我錯誤:… VM 錯誤:還原。revert 事務已恢復到初始狀態。
即使在這一點上,輸入“a”仍然會給我錯誤:
.. 位置 1 的 JSON 中的意外標記 a
我已經經歷了幾次,無法解釋這些錯誤差異。到底是怎麼回事?
在 Remix 中,存在一個奇怪的、持續存在的錯誤,即當您在字元串中使用字母字元時必須使用引號。如果函式需要一個字元串,但您只返回數字字元,它將為您將其轉換為字元串。
因此,請確保您按字面意思輸入
"3a24"
而不是3a24
.根據程式碼,您的契約仍會還原它,但至少它會起作用。