【问题标题】:warning of signed/unsigned in function有符号/无符号函数的警告
【发布时间】:2015-02-13 18:34:04
【问题描述】:

我已经编写了一个函数来解析字符串参数作为我项目的一部分。功能一切正常,但我收到一条警告,上面写着:C4018: '<' : signed/unsigned mismatch。我不知道为什么会出现这个警告。我可以在这里得到一些帮助。谢谢!

void FileMgr::parseCmdLineForTextSearch(std::string b)
{
    int count=0;
    int flag = 0;
    patternVector.clear(); 
    for (int i = 0; i < b.length(); i++)   // this line where
 // the warning line comes


{
            if (b[i] == '"')
            {
                count++;
            }
        }
        if (count == 2)
        {
            for (int i = 0; i < b.length(); i++)
            {
                if (b[i+1] == '"')
                {
                    flag = 1;
                    tmp = b.substr(0, i+1);
                    tmp.erase(0, 1);
                    break;
                }
                else
                {
                    continue;
                }
            }
            std::istringstream iss(b);
            std::string word;
            while (iss >> word)
            {                  // for each word in b
                if (word.find("*.") == 0)
                {        // if it starts with *.
                    patternVector.push_back(word); // add it
                }
            }
            if (patternVector.size() == 0)
            {
                patternVector.push_back("*.*");
            }
            isCorrect = true;
        }
        else
            isCorrect = false;
    }

【问题讨论】:

  • 修复它,我认为警告是错误的(虽然你的线路会表现良好,其他可能不会)

标签: c++


【解决方案1】:

b.length() 返回未签名的size_t。在您的 for 循环中,您将有符号的 int i 与无符号的 b.length() 进行比较,这就是您看到警告的原因。要摆脱它,请在使用i 指示数组索引时使用size_t i 而不是int i

不相关:您在此处if (b[i+1] == '"') 的访问权限越界。

【讨论】:

  • 我是否还需要对功能进行更改。或者结果和 int i 一样
  • 只要i 只是一个数组索引,就完全没问题。或者,您只需将 b.length() 转换为 int 即可避免警告。 for (int i = 0; i &lt; (int)b.length(); i++)。诚然,这看起来有点难看:)
  • @Pradhan 或首先以无符号 i 开头
  • 顺便说一句,比较有符号和无符号值的原因是 "The Usual Arithmetic Conversions"。也就是说,在比较之前,负值signed int 将被转换为对这些相同位的unsigned int 解释,并产生一个非常大的正值。
  • @DieterLücking 是的,这就是我在答案中的建议。但是,OP 评论询问是否需要更改他的其余代码。所以如果i 真的需要能够保存有符号的值......
【解决方案2】:

您可以使用std::string::iterator 避免unsignedsigned 比较无意义。

for ( auto iter = b.start(); iter != b.end(); ++iter )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2013-11-11
    • 2011-04-09
    • 2015-12-04
    相关资源
    最近更新 更多