[英]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;
}
}
不,實際上,它甚至不應該編譯。 (在將代碼發布到這里之前,您是否嘗試過編譯代碼?)
如果字符串相等,則strncmp
和strcmp
返回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
。 您在這里做錯了幾件事:
您沒有辦法移動指針string
和binary
,因為您消耗了輸入中的字符並產生了新的二進制操作碼到輸出中。 如果您要反復調用函數opCodeBinary
這將很有用。 我建議您對opCodeBinary
兩個參數都使用雙指針。
我假設您不應該以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.