我有一个项目需要我们作为程序员,将一行汇编语言翻译成机器语言并计算小数。我们有自己的带有操作码的示例计算机,以使其更易于计算。我的问题是以下功能是否符合我的目标。
在 main 函数中,我有一个标记为 char binary[3] 的字符数组,因为返回的值将是三位。此外,函数中有一个 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");
您不能从函数返回数组;有多种方法可以间接完成同一件事,但它们都有些乏味。
关于C 编程 : pointers/char array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18902021/