Char 23:警告:未指定与字符串文字的比较结果(改用显式字符串比较函数)[-Wstring-compare]

问题描述 投票:0回答:2

当我尝试在 leetcode 中运行这段代码时,它显示以下错误。

我试过用''删除“”它仍然不起作用

string reverseWords(string s) {
        s.insert(0," ");
        string st="";
        string ans="";
        for(int i= s.size();i>=0;i--)
        {
            while(s[i]!=" ")
            {
                st+=s[i];
            }
            reverse(st.begin(),st.end());
            ans.push_back(st);
            st="";
        }
        return ans;
    }

c++
2个回答
0
投票

您看到的警告消息与行

while(s[i]!=" ")
.

有关

在 C++ 中,

!=
运算符用于比较两个值是否不等。但是,在这种情况下,您将字符
s[i]
与字符串文字
" "
进行比较,这可能会导致意外行为。

要修复此警告,您应该使用单引号来创建字符文字而不是字符串文字。所以,你应该把

while(s[i]!=" ")
行改成
while(s[i]!=' ')

这里是更正后的代码:

string reverseWords(string s) {
    s.insert(0," ");
    string st="";
    string ans="";
    for(int i= s.size();i>=0;i--)
    {
        while(s[i]!=' ')
        {
            st+=s[i];
        }
        reverse(st.begin(),st.end());
        ans.push_back(st);
        st="";
    }
    return ans;
}

请注意,此代码在按预期工作之前还有其他问题需要修复。

这是我可能对代码进行的更正:

string reverseWords(string s) {
    s.insert(0, " ");
    string st = "";
    string ans = "";
    for (int i = s.size() - 1; i >= 0; i--) {
        while (i >= 0 && s[i] != ' ') {
            st += s[i];
            i--;
        }
        reverse(st.begin(), st.end());
        ans += st[0];
        st = "";
    }
    return ans;
}
  1. 循环条件应该从
    s.size() - 1
    开始,而不是
    s.size()
    ,因为C++数组是零索引的,循环需要遍历字符串中的所有字符。
  2. 循环应该迭代到字符串的开头,它的索引为0。所以循环条件应该是
    i >= 0
    .
  3. push_back
    字符串的
    ans
    方法应该用单个字符调用,而不是字符串。所以线
    ans.push_back(st);
    应该改为
    ans += st[0];
    .

0
投票

std::string::operator[]
返回
char
对象中的单个
std::string
。您正在将单个
char
与字符串文字(也称为
const char[]
数组)进行比较,这不是有效的操作。您需要将
char
与另一个
char
进行比较。

改变这个:

while(s[i]!=" ")

为此

while(s[i]!=' ')

此外,您正在尝试将

push_back()
std::string
转换为另一个
std::string
,但是
std::string::push_back()
不采用
std::string
,而是采用
char

改变这个:

ans.push_back(st);

对此:

ans += st;

© www.soinside.com 2019 - 2024. All rights reserved.