【问题标题】:C++ invalid conversion from char to const char*从 char 到 const char* 的 C++ 无效转换
【发布时间】:2014-02-05 01:58:31
【问题描述】:

如何修复此功能?我得到的错误是:从 char 到 const char* 的无效转换在线

if(strcmp('\0', p->pubLow[i][j]) == 0) {

代码:

struct Prefix {
    int  no;             // number of entries
    int  area[MAX];      // area elements
    char pubLow[MAX][8]; // low end of publisher range
    char pubHgh[MAX][8]; // high end of publisher range
    int  pubLen[MAX];    // no of chars in publisher string
};

int minNoDigits(const Prefix* p, int area) {
    int minNoDigits = 0;
    for(int i = 0; i < p->no; i++) {
        if(area == p->area[i]) {
            cout << "p->pubLow[i] is: " << p->pubLow[i] << endl;
            minNoDigits = 1;
            for(int j = 1; j < 3; j++) {
                if(p->pubLow[i][j] = '\0') {
                    j = 3;
                    i = p->no;
                }
                else {
                    minNoDigits++;
                }
            }
        }
    }
    return minNoDigits;
}

编辑以提供更多信息。

我已将行改为

if(p->pubLow[i][j] = '\0') {

新错误:

assignment of read-only location p->Prefix::pubLow[i][j]

【问题讨论】:

  • pubLow的类型是什么?
  • @KirilKirov pubLow 似乎是 char**
  • @OP 为什么你不能阅读@987654326的文档 @?说真的……
  • 您错误地从答案中获取了代码,这就是您收到分配错误的原因。仔细阅读,看看有什么不同,然后理解。
  • @OP 这确实可以由strcmp 的文档来回答,正如 H2CO3 已经提到的 (-1)

标签: c++ char constants


【解决方案1】:

我知道p-&gt;pubLow[i][j] 实际上是char,因为从您的代码中pubLow 似乎是char**,所以这就是您要查找的内容:

if(p->pubLow[i][j] == '\0') {

strcmp() 的原型如下:

int strcmp ( const char * str1, const char * str2 );

这里是documentation

因此,总而言之,您正在尝试比较 2 个字符,而 strcmp() 旨在比较 2 个常量字符串

【讨论】:

  • 注意:“\0”是两个零字符。
  • 我认为他们正在尝试将终止字符与pubLow[i] 的每个字符进行比较。
【解决方案2】:

为什么需要 strcmp(...) 进行字符比较? 你可以这样做

if('\0'== p->pubLow[i][j]) ...

【讨论】:

    【解决方案3】:

    strcmp 比较来自const char*s 的字符串:

    if(strcmp("", p->pubLow[i][j]) == 0) {
    

    【讨论】:

    • 注意:“\0”是两个零字符。
    • @nestedloop,好吧,使用 strcmp 并没有看起来那么大的开销 :) 谢谢你的关注。
    • @IvanGrynko 在查看 OP 的代码时,似乎 p->pubLow[i][j] 实际上是一个字符。
    【解决方案4】:

    '\0' 是一个字符,而不是其他人回复的字符串。

    我不确定你想用if(strcmp('\0', p-&gt;pubLow[i][j]) == 0) 实现什么

    如果你想检查字符串的结尾,你可以这样做if('\0' == p-&gt;pubLow[i][j])

    【讨论】:

      【解决方案5】:

      看起来p-&gt;pubLow[i]char*,而您正尝试将它与终止字符\0 逐个字符进行比较?

      正如其他人指出的那样,strcmp 旨在用于比较字符串而不是单个字符。您可以使用== 运算符来比较字符,但由于您这样做是为了查找字符串的长度,因此最好直接执行此操作。

      您想返回与area 相同区域的p-&gt;pubLow[i] 中的位数,对吗?这个怎么样:

      int minNoDigits(const Prefix* p, int area) {
          for(int i = 0; i < p->no; i++) {
              if(area == p->area[i]) {
                  cout << "p->pubLow[i] is: " << p->pubLow[i] << endl;
                  return strlen(pubLow[i]) + 1;
              }
          }
          return 0;
      }
      

      您可能还会发现 break 将来很有用 - 它会让您摆脱 for 循环(我注意到您直接设置了 ji 来执行此操作)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        • 2017-03-19
        • 1970-01-01
        相关资源
        最近更新 更多