当我运行此程序时得到两个警告,我无法弄清楚如何阻止这种情况发生。任何帮助,将不胜感激!
警告:有符号和无符号整数表达式之间的比较
我在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"; }
答案 0 :(得分:7)
您将a.find(" ")
的结果分配给size_t
。 size_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
),但是当它/如果教授看到它时,它不是很模糊,以保证设置警报,所以我不发布它(至少现在)。