String

為什麼 remix 不允許在此程式碼中輸入字母?

  • June 26, 2018

好的,所以這段程式碼實際上被設計為在輸入除 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.

根據程式碼,您的契約仍會還原它,但至少它會起作用。

引用自:https://ethereum.stackexchange.com/questions/52058