【问题标题】:strcmp string and character array in cc中的strcmp字符串和字符数组
【发布时间】:2012-12-24 07:27:07
【问题描述】:

这是我的代码。我正在尝试进行字符串比较。串行输入读取按下的键并将 cmd.command 设置为在键盘上键入的内容。然后我拿它做一个字符串比较,看看它是否是我列表中的一个命令。我坚持的是字符串比较。

typedef struct {
    const char *cmd;
    void (*cmdFuncPtr)(void);
}CmdStruct;

typedef struct {
    char command[16];
    char argument[16];
} Command;

Command cmd;

CmdStruct cmdStructArray[] = { {"led",      LEDHandler      },
                               {"relay",    RelayFunction    },  };

void ProcessCommand() {
    for (j = 0; j < sizeof(cmdStructArray)/sizeof(cmdStructArray[0]); j++) {
        if(strcmp(cmdStructArray[j].cmd, cmd.command) == 0) {
            // do stuff
        }
    }
}

如果我输入“led”,那么这两个 printf 语句会打印相同的内容。

printf(cmdStructArray[0].cmd);
printf("%s", cmd.command);

如何使字符串比较起作用?

【问题讨论】:

  • 您如何获得您的意见?可能是fgets,然后去掉后面的换行符。
  • 是的,字符串之间会有一些细微的差别。可能是尾随换行符,也可能是大小写不同。
  • strcmp() 工作得很好。你有什么问题? cmd 是从哪里来的?我看不出这是在哪里声明的。
  • 使用printf("'%s'\n", XXX);就很明显了。
  • 您还应该确保两个字符串都为空终止。当您初始化结构时,这些字符串以空值结尾。您可以添加 '\0' 作为您键入的数组的最后一个字符。

标签: c arrays string character strcmp


【解决方案1】:

您的cmd.command 命令可能有隐藏的尾随空格。在运行比较之前去掉空格。 (感谢 cmets 中的 David Schwartz!)

【讨论】:

    【解决方案2】:

    我找到了一个修复方法,现在 strcmp 可以工作了。我更改了结构数组中的结构。现在是

    typedef struct {
        char cmd[16];
        void (*cmdFuncPtr)(void);
    }CmdStruct;
    

    我不知道为什么会这样,也不知道有什么区别。我之前的 const char *cmd 也是在 C 中创建“字符串”的一种方式。

    【讨论】:

    • 嗯不完全是。这样,实际上为您的字符串缓冲区分配了存储空间,而另一种方式,您只是指向一个内存位置。任何弄乱该位置的东西都会以旧方式杀死您的“字符串”
    • 您的原始代码看起来也正确:cmd 字段被初始化为具有静态存储持续时间(字符串文字)的内存指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    相关资源
    最近更新 更多