【问题标题】:testing for string-equality without the string library在没有字符串库的情况下测试字符串相等性
【发布时间】:2015-02-13 16:36:54
【问题描述】:

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

基本上,commands数组是:[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 语句中?

【问题讨论】:

  • 你测试的是地址是否相同,而不是内容是否相同。使用strcmp()比较字符串的内容。
  • 我不能使用字符串库
  • @user93110 然后编写您自己的类似 strcmp 的函数。无法使用标准库不会使指针比较工作来比较字符串的内容。
  • 然后写一个循环比较字符,就像strcmp一样。
  • 我很怀疑你不能使用这个库...

标签: c string c-strings


【解决方案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()。

【讨论】:

  • @user93110 我更新了代码,所以它只比较相同大小的字符串
  • 此实现不能称为“strcmp”等价物,因为返回值不匹配。这里只返回 -1 或 0,而原始 strcmp 也可以根据字符串的字典顺序返回 1。
  • @SirDarius 实际上它应该返回 0 取决于第一个字符串的不匹配字符是在第二个字符串(在字母表上)上的字符之前还是之后。但这只是一个例子。他的问题需要对这个函数进行更多的调整。
【解决方案2】:

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

编辑:如果您不能使用字符串库,请编写一个简单的循环。在循环期间,如果您发现两个字符串之间的字符不同,则返回错误值(例如 0),并且如果您可以在没有找到不同字符的情况下转到字符串的末尾,则返回真值(例如 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2018-07-25
    • 2023-03-18
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    相关资源
    最近更新 更多