【问题标题】:How to properly use strcmp in a function如何在函数中正确使用 strcmp
【发布时间】:2014-11-03 15:40:44
【问题描述】:

我很难理解如何使用 strcmp。我对发送到 equals() 函数的字符串所做的更改似乎不会影响测试 1a - 1d 的结果。函数调用前面的感叹号有什么作用?该程序的目的是比较两个字符串,如果字符串长度相同且大小写相同,则显示“正确”。以下代码由我的教授提供。我只能更改 equal() 函数和函数原型内部的内容。

    #include <iostream>
    #include <cstring>
    #include <cctype>

    using std::cin;
    using std::cout;
    using std::endl;

bool equals(const char*, const char*);

int main()
   {

   // Tests 1a - 1d: Test the equals() function
   cout << "Test 1a: ";
   if (equals("catapult", "catapult"))
      cout << "correct\n";
   else
      cout << "incorrect\n";

   cout << "Test 1b: ";
   if (!equals("catapult", "catamaran"))
      cout << "correct\n";
   else
      cout << "incorrect\n";

   cout << "Test 1c: ";
   if (!equals("cat", "catamaran"))
      cout << "correct\n";
   else
      cout << "incorrect\n";

   cout << "Test 1d: ";
   if (!equals("catapult", "cat"))
      cout << "correct\n";
   else
      cout << "incorrect\n";

   cout << endl;
return 0;
}

bool equals (const char* str1, const char* str2)
{
    if (strcmp(str1, str2) == 0)
        return true;

    return false;

}

【问题讨论】:

  • 这是在 c++ 中正确使用 strcmp 的方法:第 1 步:将每次出现的 char const* 替换为 std::string,第 2 步:将每次出现的 strcmp 替换为 ==
  • ! 是逻辑非运算符,它将后面的false 更改为true,或将true 更改为false。所以!true==false!false==true!equals(x, y) 表示“not (equals(x, y))”或 - 用英语解释 - “x 不等于 y”。
  • "如果字符串的长度和大小写相同" - 这不是strcmp 测试的内容...要比较相等,它们的长度必须相同,并且每个字符必须完全匹配...仅仅使用相同的大写或小写是不够的。
  • 运行您的程序 - 它们都打印“正确”(tested on ideone.com here)... 这是因为每个测试都设计为根据已知的参数相等或不相等使用 equals!equals
  • 严格来说它不是重复的,因为它适用于 C,而不是 C++,但问题 Testing string equality issue 有一个答案,使得使用 strcmp() 非常容易。当然,既然我写了答案,我是有偏见的,但我认为它确实让生活更轻松。

标签: c++ string pointers compare strcmp


【解决方案1】:

感叹号用作一元前缀运算符时,是逻辑非(或否定)运算符。

所以

if (!equals("catapult", "catamaran"))

应该被解读为好像equals("catapult","catamaran") 的否定是真的, 换句话说,如果equals("catapult","catamaran") 为假。

请注意,否定运算符! 的优先级低于函数调用。所以你的!equals("catapult","catamaran")!(equals("catapult","catamaran"))意思一样

顺便说一句,如果你想用真正的 C++ 编写代码,你应该了解std::string。您应该阅读strcmp 的文档,另请参阅strcasecmp

最后,您应该编译所有警告和调试信息(例如g++ -Wall -g)并使用调试器(gdb)逐步运行您的程序。

【讨论】:

  • 我应该措辞更好一点。我知道 ”!”是否定的。我只是不明白为什么在这种特定情况下会出现。那些测试是我的教授做的。该功能以及过去的功能也已经提供。我只提供函数内部的代码。感谢您的帮助!
  • 因为您的教授不希望 "cat""catamaran" “相同”,他是对的。
  • 你是说感叹号是伪代码吗?当返回的值将从否定中翻转时,创建一个比较字符串的函数对我来说是没有意义的。
  • 确实有道理。一旦你获得了equal 函数,定义not_equal 函数将毫无用处。但请在调试器中逐步运行您的示例以了解更多信息。
猜你喜欢
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 2015-12-14
相关资源
最近更新 更多