【问题标题】:error C2664: 'strcmp' : cannot convert parameter 2 from 'char' to 'const char *'错误 C2664:“strcmp”:无法将参数 2 从“char”转换为“const char *”
【发布时间】:2011-03-27 20:08:26
【问题描述】:

我需要关于那个脚本的帮助。

BOOL Checking(LPCSTR MacID) {
    char ClientMacs[18] = { "11:22:33:44:55:66",};

    for(int x=0; x < 10; x++) {
        if(!strcmp(MacID, ClientMacs[x])) {
            printf(MacID," Successed!");
            return true;
        }
    }

    return false;
}

我来了

错误 C2664:“strcmp”:无法转换 参数 2 从 'char' 到 'const char *' 从整数类型转换为指针类型需要 reinterpret_cast, C-style cast 或 函数式转换

当我尝试编译它时。

【问题讨论】:

    标签: c++ strcmp


    【解决方案1】:

    不是

    if(!strcmp(MacID, ClientMacs[x])) {    }
    

    但是

    if(!strcmp(MacID, &ClientMacs[x])) { ... }
    

    Arg 2 必须是 char *,但您将它作为 char。如果你的 arg 2 很简单

      ClientMacs  // compiler understands that this is shorthand for &ClientMacs[0]
    

    会好的。但是当索引不是零时,您必须将与号放在一起。

    --皮特

    【讨论】:

    • 不知何故,我不认为他的真正意图是将他的数组中的单个字符与传入的字符串进行比较。
    • @Brian -- 我不认为你错了。根据定义,strcmp( ) 不比较单个字符。为什么你认为它会?我认为他想在 ClientMacs[x] 开始多字符比较并继续多字符比较,直到 strcmp() 在一个或另一个字符串中找到 NUL。这就是 strcmp() 所做的。谁说过单字符比较?
    • @Pete - 他通过尝试将ClientMacs[x](单个字符)传递给strcmp(当然需要char*)做到了。您的更改将使其工作,但只能通过完全取消他的循环。你让他传入&amp;ClientMacs[0] 的第一次迭代将成功或失败——这与传递ClientMacs 相同——它是指向数组第一个字节的指针。只有当他认为他有一个多维数组时,他的逻辑才有意义。
    • 在他最初的任务中悬空的, 为该理论增添了额外的可信度。
    • 对不起-我措辞不正确-我想说的是,做您所描述的事情几乎没有逻辑。他为什么要试图找出字符串是否从前 10 个字节的某个地方开始匹配?
    【解决方案2】:

    缺少和 & ……非指针 指针

    BOOL Checking(LPCSTR MacID) {
    
        const char* ClientMacs[18] = { "11:22:33:44:55:66",};
    
         for(int x=0; x < 10; x++) {
    
             if(!strcmp(MacID, ClientMacs[x])) {
    
                  printf(MacID," Successed!");
    
                  return true;
    
             }
    
        }
    
        return false;
    
    }
    

    也许

    【讨论】:

    • 不知道,然后是崩溃的windows要求调试
    • 错误是当x > 0时,这段代码将空指针传递给strcmp()
    【解决方案3】:

    我认为您不太了解字符串(或指针)在 C 中的工作原理。

    您正在尝试将字符数组中的单个字符与传入的字符串进行比较:

    if(!strcmp(MacID, ClientMacs[x])
    

    【讨论】:

    • strcmp( ) 在这里不起作用。对于单字符比较,请执行以下操作:
    • if (MacID[x] == ClientMacs[x]) { ... } 或类似的。
    • 这就是我的意思,Pete。威尔迪恩有正确的答案。不幸的是,这个可怜的家伙可能永远看不到它(尽管当他试图将{ "&lt;mac address&gt;", "&lt;mac address&gt;" } 分配给他的字符数组时,他可能会回来)。
    【解决方案4】:
    if(!strcmp(MacID, ClientMacs[x]))
                    // ^^^^^^^^^^^ gives the character at index x
    

    可能你的意思是-

    if(!strcmp(MacID, &ClientMacs[x]))
                    //^  Added & symbol
    

    鉴于printf 声明,我认为没有必要逐个字符比较。不需要循环。这可以是-

     for(int x=0; x < 10; x++) {
        if(!strcmp(MacID, ClientMacs[x])) {
            printf(MacID," Successed!");
            return true;
        }
    }
    

    浓缩为-

    if(!strcmp(MacID, ClientMacs)) {  // Changed ClientMacs[x] to ClientMacs
        printf(MacID," Successed!");
        return true;
    }
    

    【讨论】:

      【解决方案5】:

      ClientMacs 需要是指向字符(字符串指针)的指针数组,而不是字符数组。您不妨使用 LPCSTR typedef,因为您也将它用于函数参数。

      试试这个:

      BOOL Checking(LPCSTR MacID) {
      
          LPCSTR ClientMacs[18] = { "11:22:33:44:55:66", [put the other 9 (or is it 17?) MAC address strings here]};
      
          for(int x=0; x < 10; x++) {
      
               if(!strcmp(MacID, ClientMacs[x])) {
                  printf(MacID," Successed!");
                  return true;
               }
          }
      }
      

      你的命名通常很糟糕,但我没有改变它。

      【讨论】:

      • @Will -- 恐怕你说的并不完全正确。 OP 不想要一个指针数组,而是一个指向 char 数组 ClientMacs[] 内某处的指针。
      • @Pete - 我认为他不会。我认为这就是他最终试图做 Will 上面概述的事情(注意他的 char 数组分配中悬空的,,比较前 10 个字符是没有意义的)
      • dodwords: mov eax,[edx] cmp al,[ecx] jne short donene or al,al jz short doneeq cmp ah,[ecx + 1] jne short donene or ah,ah jz short doneeq shr eax,16 ->> 使用 2005 调试在文件 strcmp.asm 上的 cmp al,[ecx] 上崩溃
      • 我已经添加了一个关于丢失地址在哪里的注释 - 我 95% 确定他正在尝试查看提供的地址是否与任何可能性列表匹配。
      • 这个问题太失败了(不是你的回复——这基本上是钱)。请注意,!strcmp() 将导致 printf() 在字符串 不匹配 匹配时被调用并返回。当然,您永远不会看到“成功”,因为 printf() 也是错误的;它只会打印MacID
      【解决方案6】:

      由于您已标记此 C++,我建议您不要使用 strcmp,而是使用 std::string

      std::set<std::string> ClientMacs;
      
      ClientMacs.insert("11:22:33:44:55:66");
       // presumably insert more MAC addresses here
      
      
      bool check(std::string const &MacID) {    
          if (ClientMacs.find(MacID) != ClienMacs.end()) {
              std::cout << "Success!";
              return true;
          }
      }
      

      但是,我应该补充一点,您在这里要完成的工作并不完全清楚。我的假设是您有一个可能的 MAC 地址列表(例如,本地网络中的所有计算机),并且您正在尝试验证您收到的 MAC 地址(例如,在以太网数据包中)是否与其中一个匹配那些(例如,为了确保只接受来自已知来源的数据包的防火墙命令)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-27
        • 1970-01-01
        • 1970-01-01
        • 2012-09-05
        相关资源
        最近更新 更多