在没有字符串库的情况下测试字符串相等性

testing for string-equality without the string library

我编写了代码,我想查看两个 char* 'strings' 是否相等。我在代码里写了打印语句来帮我调试。

基本上,命令数组是:[a, b, null]

用户输入的 cmd 可以是任何内容,但如果它是 a、b 或 null,那么我们要进入 if 语句。

for (i = 0; i < 3; i++){
    printf("cmd.name = : %s\nCommand = %s\n", cmd->name, commands[i]);
    if (cmd->name == commands[i]){
        printf("inside if\n");
        valid = 1;
    }
}

正在打印:

cmd.name = : a
Command = a  
cmd.name = : a
Command = b
cmd.name = : a
Command = (null)

所以在第一个实例中 a 应该等于 a 对吗?为什么它不进入 if 语句?

char* 表示指向字符串第一个字符的指针,因此通过测试 cmd->name == commands[i] 可以测试 name 是否与 commands[i] 具有相同的地址。要比较两个字符串,您可以使用标准库 (string.h) 的 strcmp 函数,如果函数 return 0 您的两个字符串相等。

编辑:如果您不能使用字符串库,请编写一个简单的循环。在你的循环中,如果你发现两个字符串之间的字符不同,你 return 一个错误的值(例如 0),如果你可以在你的字符串末尾找到不同的字符,那么你 return真值(示例 1)

由于不能使用字符串库,所以需要自己实现strcmp函数。

char*作为一种类型,只是一个指针,即它存储的是一个地址。然后简单的'=='将比较地址,这不是你想要的。

一个简单的 strcmp 函数可以是:

int myStrcmp(const char *str1, int size1, const char *str2, int size2)
{
   int i = 0;

   if(size1 != size2)
      return -1 //different strings

   for(i = 0; i < size1; i++)
   {
       if(str1[i] != str2[i])
           return -1; //different strings
   }

   return 0; //same strings
}

这里的技巧是您必须以某种方式知道字符串的大小。如果你不能使用字符串库,我想你也不能使用 strlen()。