家庭作业问题中的警告C ++

时间:2010-11-22 05:56:28

标签: c++ class function

当我运行此程序时得到两个警告,我无法弄清楚如何阻止这种情况发生。任何帮助,将不胜感激!

警告:有符号和无符号整数表达式之间的比较

我在extract_word函数中获得2行的警告。

#include<iostream>
#include<string>

using namespace std;

class StringModify {

    public:

    void get_data();
    //takes a line of input from the user

    string& extract_word(string& a);
    //extracts each word from the input line

    string& reverse_word(string& s);
    //returns a string which is reverse of s

    void rev();

    void swap(char& v1, char& v2);
    //interchanges value of v1 and v2

    void append(const string& reverse_word);
    //puts together each reversed word with whitespaces to get formatted_line

    void display();
    //diss both input line and formatted_line

    private:
    string origional_string;   //original string
    string formatted_string; //formatted string
    string word;

};


int main() {
    StringModify data1;
    //data1 becomes the call for class StringModify

    data1.get_data();
    // Exicution of get_data in class StringModify
    data1.rev();
    // Exicution of rev in class StringModify
    data1.display();
    // Exicution of display in class StringModify

    return 0; }

void StringModify::get_data() {
    cout << "Enter the string: ";
    getline(cin, origional_string); }

string& StringModify::extract_word(string& a) {
    size_t position = a.find(" ");

    if(position != -1)
    {
        word = a.substr(0, position);
        a.erase (0, position + 1);
    }

    else
    {
        word = a;
        a = "";
    }

    return word; }

string& StringModify::reverse_word(string& s) {
    for(int i = 0; i < s.length() / 2; i++)
    {
        swap(s[i], s[s.length() - 1 - i]);
    }

    return s; }

void StringModify::rev() {
    string copy = origional_string;

    while (!copy.empty())
    {
        append(reverse_word(extract_word(copy)));
    } }

void StringModify::swap(char& v1, char& v2) {
    char temp = v1;
    v1 = v2;
    v2 = temp; }

void StringModify::append(const string& reverse_word) {
    formatted_string += reverse_word + " "; }

void StringModify::display() {
    cout << "\nThe original string: "
         << origional_string << "\n"
         << "\nThe formatted string: "
         << formatted_string << "\n"; }

5 个答案:

答案 0 :(得分:7)

您将a.find(" ")的结果分配给size_tsize_t是无符号类型;它永远不会有负值。

请注意,这并不意味着比较永远不会成立。 -1将被转换为无符号,因此可以执行比较(这是所谓的通常算术转换的一部分)。将-1转换为无符号时,它会生成无符号类型可表示的最大值。因此,如果find()返回尽可能大的size_t,那么比较将产生真。

要解决此警告,您应该与std::string::npos进行比较,如果找不到该元素,则为find()返回的值。

答案 1 :(得分:4)

size_t是无符号类型,因此“永远不会”等于-1。我在引号内加never的原因是因为它在某些情况下可能会比较-1,但这只是因为它或-1已经变形为其他数据类型。< / p>

string::find documented返回string::npos如果找不到字符串且你应该将你的返回值与它进行比较(它是{无论如何{1}}相当于size_t,但这样做会让你不会收到警告。)

答案 2 :(得分:4)

使用string :: npos而不是-1

答案 3 :(得分:2)

size_t是无符号整数,您将其与-1进行比较。您需要将其类型更改为其他类型。

答案 4 :(得分:2)

查看代码:

    size_t position = a.find(" ");

    if(position != -1)

...警告是因为size_t是无符号类型,因此它实际上永远不会为-1。实际上,比较可以成功,但只是因为-1在比较之前被转换为size_t(在此过程中成为size_t可能的最大值)。如果你意识到这一点,并希望它发生,那么明确地将-1转换为size_t通常会消除警告。为了在技术上正确,可能最好使用std::string::npos而不是-1。

更好的做法是通过(例如)将字符串放入stringstream并使用operator>>提取字词来消除所有这些。

编辑:由于这似乎是一个有点(和常见)问题,我决定编写自己的版本以获得乐趣。除非你仔细研究真的,否则你最好不要把它转过来,因为我几乎可以保证看到这个的教授会有很多问题(如果你给的话)任何错误的答案,你需要处理的问题是“你想要炸薯条吗?”:

#include <string>
#include <iostream>
#include <iterator>

class rev_string { 
    std::string data;
public:
    rev_string(std::string const &input) { 
        data.assign(input.rbegin(), input.rend());
    }
    friend std::ostream &operator<<(std::ostream &os, rev_string const &r) { 
        return os << r.data;
    }
};

int main() { 
    std::copy(std::istream_iterator<std::string>(std::cin),
              std::istream_iterator<std::string>(),
              std::ostream_iterator<rev_string>(std::cout, " "));
    return 0;
}

请注意,实际上有一种更清晰的方法(使用std::transform),但是当它/如果教授看到它时,它不是很模糊,以保证设置警报,所以我不发布它(至少现在)。