簡體   English   中英

C編程:指針/字符數組

[英]C Programming : pointers/char array

我有一個項目需要我們作為一名程序員,將匯編語言轉換為機器語言並計算小數。 我們擁有帶有操作碼的示例計算機,以使其更易於計算。 我的問題是以下功能是否可以實現我的目標。

在主函數中,我有一個標記為char binary [3]的char數組,因為返回的值為三位。 另外,該函數中有一個char opcode [MAXLINELENGTH],它可以從文件中正確讀取操作碼行,因此我在函數中使用* string指向它。 這樣是否可以正確找到匹配項,並使用正確的3位位代碼填充main中的二進制數組?

//function should return true if the proper binary output was successfuly copied with the matching opcode
int opcodeBinary(char *string,char *binary){
    if(strncmp(*string,"add"){
        *binary="000";
        return 1;
    }
    else if(strncmp(*string,"nand"){
        *binary="001";
        return 1;
    }
    else if(strncmp(*string,"lw"){
        *binary="010";
        return 1;
    }
    else if(strncmp(*string,"sw"){
        *binary="011";
        return 1;
    }
    else if(strncmp(*string,"beq"){
        *binary="100";
        return 1;
    }
    else if(strncmp(*string,"jalr"){
        *binary="101";
        return 1;
    }
    else if(strncmp(*string,"halt"){
        *binary="110";
        return 1;
    }
    else if(strncmp(*string,"noop"){
        *binary="111";
        return 1;
    }
    else{
        return 0;
    }
}

不,實際上,它甚至不應該編譯。 (在將代碼發布到這里之前,您是否嘗試過編譯代碼?)

如果字符串相等,則strncmpstrcmp返回0(並且strncmp接受三個參數,而不是兩個!)。 要比較兩個字符串是否相等,您需要以下內容:

if (strncmp(string, "nand", 4) == 0) {
    ...

或者,更簡單地說:

if (strcmp(string, "nand") == 0) {
    ...

由於字符串文字"nand"對要比較的字符數設置了限制,因此使用strncmp而不是strcmp沒有什么意義。

strcmp兩個參數(或strncmp的前兩個參數)都是char*類型。 string已經是char*類型; 假定它指向字符串(第一個字符),只需將string而不是*string傳遞給strcmp的第一個參數。

*binary = "000"; 甚至不應該編譯。 binary = "000"; 會編譯,但不會做您想要的; 它是一個指針分配,並且只影響您的函數本地的binary的值; 函數返回后,沒有可見的效果。

您可以將函數的第二個參數設為char** 那么調用方可以執行以下操作:

char *binary;
if (opcodeBinary(some_string, &binary) {
    /* binary now points to a string like "000" */
}

或者調用者可以為字符串分配空間:

char binary[5]; /* or whatever size you need */

然后在函數內部,通過調用strcpy替換賦值:

strcpy(binary, "000");

不能從函數返回數組; 您可以通過多種方式間接完成同一件事,但它們都有些乏味。

您的函數opCodeBinary不進行類型檢查。 分配*binary="000" ,左側是char類型的左值,而右側是char* 對於strncmp的第一個操作數也是如此。 在C中使用字符串時,請勿在前面加*

我假設您需要執行的操作是生成與匯編命令相對應的二進制操作碼。 您應該從string讀取命令並將操作碼寫入binary 您在這里做錯了幾件事:

  1. 您沒有辦法移動指針stringbinary ,因為您消耗了輸入中的字符並產生了新的二進制操作碼到輸出中。 如果您要反復調用函數opCodeBinary這將很有用。 我建議您對opCodeBinary兩個參數都使用雙指針。

  2. 我假設您不應該以ASCII表示形式生成操作碼000 (即字符串"000" ),而是以二進制形式包含一個包含它的字節(或者更糟的是只有三個位)。

我為您的opCodeBinary函數建議以下內容。 它可以正確解析上面的(1)和(2),但是它假定每個操作碼都將進入二進制文件中的一個或多個(完整)字節。

int opCodeBinary (char **string, char **binary)
{
  if (strncmp(*string, "add", 3) == 0) {
     *string += 3;
     *(*binary)++ = '\x00';
     return 1;
  }
  ...
}

使用錯誤的strcnmp:傳遞字符(取消引用的char指針)而不是char指針(字符串),您需要傳遞要比較的字符數,作為第三個參數。

建議:使用哈希將關鍵字映射到二進制代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM