Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在c++;,忽略空格_C++_String_Cin - Fatal编程技术网

C++ 如何在c++;,忽略空格

C++ 如何在c++;,忽略空格,c++,string,cin,C++,String,Cin,我的任务是创建一个程序,将一个度量单位转换为另一个度量单位。因此,如果用户输入5公斤,它会将其转换为等值的磅。这些要求规定,用户输入必须在一行上全部读取,并且输入中任何地方的任何数量的空格都不能消除功能。我的问题是:如果用户输入时在实际的双“质量”值之间有一堆空格,然后在计量单位中的不同单词之间有一堆空格,例如“短吨”,我如何消除空格,使其读数仅为“短吨”? 到目前为止,我的代码是: double mass; string unit; cout << "Enter mass

我的任务是创建一个程序,将一个度量单位转换为另一个度量单位。因此,如果用户输入5公斤,它会将其转换为等值的磅。这些要求规定,用户输入必须在一行上全部读取,并且输入中任何地方的任何数量的空格都不能消除功能。我的问题是:如果用户输入时在实际的双“质量”值之间有一堆空格,然后在计量单位中的不同单词之间有一堆空格,例如“短吨”,我如何消除空格,使其读数仅为“短吨”? 到目前为止,我的代码是:

double mass;  string unit;
    cout << "Enter mass: ";
    cin >> mass;
    cin.ignore();
    cin >> unit;

    if (unit == "short tonnes" || unit == "sh tn")
    {
        //convert to long tonnes
    }
双质量;弦单元;
cout>质量;
cin.ignore();
cin>>单元;
如果(单位=“短吨”| |单位=“短吨”)
{
//换算成长吨
}

我的代码在输入双质量值之前忽略空白,以及在输入字符串的第一部分之前忽略空白。但是我不知道如何让我的程序将“shorttons”读作“shorttons”(不考虑单词之间的空格数),这样我就可以进行字符串比较,并根据需要转换质量值。提前感谢您的帮助,请不要恨我,我是在我学习C++的第一周。编辑后,我认为我最初的评论是正确的。按照他人的建议,使用
getline
获取行。然后将该行放入
std::istringstream
中。使用
>
读取
stringstream
中的单词,并使用
+
操作符将它们连接起来,直到您组装了一个要查找的标记
>
的默认行为是为您放弃所有空白

所以

下面是一个简单、精简的连接示例:


您还可以使用其他技术来代替
if
/
else if
链。一个字符串和函数指针的
std::map
,但这是另一个问题

我再次道歉。编辑后,我认为我最初的评论是正确的。按照他人的建议,使用
getline
获取行。然后将该行放入
std::istringstream
中。使用
>
读取
stringstream
中的单词,并使用
+
操作符将它们连接起来,直到您组装了一个要查找的标记
>
的默认行为是为您放弃所有空白

所以

下面是一个简单、精简的连接示例:

您还可以使用其他技术来代替
if
/
else if
链。一个字符串和函数指针的
std::map
,但这是另一个问题

std::copy_if()
是做你想做的事情的另一种方式。它的工作原理非常值得学习,因为它可以在许多其他地方找到用途,而不是这个特殊的问题

如果您编写此空间删除例程,它将成为一个组件,如果您必须在不同的情况下再次解决此问题,则可以重复使用

void StripSpaces(std::string &str)
{
    std::vector<char> temp;
    temp.resize(str.length());
    auto pred = [] (char &c)
    {
        return c != ' ';
    };
    auto temp_end = std::copy_if(str.begin(), str.end(), temp.begin(), pred);
    str = std::string(temp.begin(), temp_end);
}
void条带空间(std::string&str)
{
std::向量温度;
临时调整大小(str.length());
自动预测=[](字符和c)
{
返回c!='';
};
auto temp_end=std::copy_if(str.begin(),str.end(),temp.begin(),pred);
str=std::string(temp.begin(),temp_end);
}
这会从字符串中删除空格

向量
用于保存结果值。它首先调整为输入字符串的长度,知道结果不能长于输入

pred
是一个lambda,它只接受单个字符作为参数,并返回一个
bool
,当且仅当该字符不是空格时,该值才为真

std::如果
进行重物搬运,请复制。它将把源字符串中的字符复制到
temp
,但前提是
pred
为该字符返回true。它返回一个迭代器,该迭代器引用的元素超过了我们复制的最后一个字符。如果你想考虑<代码> TEMP作为保存结果字符串,那么,它非常方便地用作<代码> TEMP.Enter()/代码>的同义词。

最后一件事是从
temp
std::copy_if()
中的数据重构参数
字符串。它的工作原理非常值得学习,因为它可以在许多其他地方找到用途,而不是这个特殊的问题

如果您编写此空间删除例程,它将成为一个组件,如果您必须在不同的情况下再次解决此问题,则可以重复使用

void StripSpaces(std::string &str)
{
    std::vector<char> temp;
    temp.resize(str.length());
    auto pred = [] (char &c)
    {
        return c != ' ';
    };
    auto temp_end = std::copy_if(str.begin(), str.end(), temp.begin(), pred);
    str = std::string(temp.begin(), temp_end);
}
void条带空间(std::string&str)
{
std::向量温度;
临时调整大小(str.length());
自动预测=[](字符和c)
{
返回c!='';
};
auto temp_end=std::copy_if(str.begin(),str.end(),temp.begin(),pred);
str=std::string(temp.begin(),temp_end);
}
这会从字符串中删除空格

向量
用于保存结果值。它首先调整为输入字符串的长度,知道结果不能长于输入

pred
是一个lambda,它只接受单个字符作为参数,并返回一个
bool
,当且仅当该字符不是空格时,该值才为真

std::如果
进行重物搬运,请复制。它将把源字符串中的字符复制到
temp
,但前提是
pred
为该字符返回true。它返回一个迭代器,该迭代器引用的元素超过了我们复制的最后一个字符。如果你想考虑<代码> TEMP作为保存结果字符串,那么,它非常方便地用作<代码> TEMP.Enter()/代码>的同义词。