C 编程 : pointers/char array

标签 c arrays pointers char

我有一个项目需要我们作为程序员,将一行汇编语言翻译成机器语言并计算小数。我们有自己的带有操作码的示例计算机,以使其更易于计算。我的问题是以下功能是否符合我的目标。

在 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;
    }
}

最佳答案

不——事实上,它甚至不应该编译。 (您是否尝试过在将代码发布到这里之前编译代码?)

如果字符串相等,

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");

不能从函数返回数组;有多种方法可以间接完成同一件事,但它们都有些乏味。

关于C 编程 : pointers/char array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18902021/

相关文章:

c - 取消引用和后缀的优先级

c - 在没有循环或条件语句的情况下从 1 打印到 1000 的 C 代码如何工作?

php - 使用 PHP 从 JSON 更新 MySQL 表

C++模板数组大小推导

c - 为什么解引用与 malloc 的行为不同?

C菜鸟 : Define size of a char array while copying contents of char* into it

c++ - 使用 __VA_ARGS__ 启用/禁用宏

javascript - 交叉比较两个数组

c - 如何使用指针移动字符

c++ - 从二叉搜索树中的 end() 迭代器递减迭代器