C++ 如何从字符串中删除点状符号

C++ 如何从字符串中删除点状符号,c++,string,C++,String,我正在寻求有关代码的帮助,该代码读取包含标点符号的字符串,并输出省略标点符号后读取的内容。我访问了这个链接,我相信我的代码是可靠的。当我编译代码时,它会提示输入字符串。但是,在输入字符串并按enter键后,什么也没有发生。之后没有输出。我对代码进行了大量调整,但没有任何效果 int main(){ string line; cout <<"Please Enter a line"<< endl; while(getline(cin, line)){

我正在寻求有关代码的帮助,该代码读取包含标点符号的字符串,并输出省略标点符号后读取的内容。我访问了这个链接,我相信我的代码是可靠的。当我编译代码时,它会提示输入字符串。但是,在输入字符串并按enter键后,什么也没有发生。之后没有输出。我对代码进行了大量调整,但没有任何效果

int main(){
    string line;
    cout <<"Please Enter a line"<< endl;
    while(getline(cin, line)){
        for(decltype(line.size()) index = 0; index != line.size() && !isspace(line[index]); ++index){        
            if (ispunct(line[index])){
                line.erase(index--,1);
                line[index] = line.size();
            }
        }
    }
    cout<< line << endl;
    return 0;
}
你把这种方法弄得更复杂了?为了这个?比它需要的要多。尝试:

int main()
{
    std::string line;
    std::cout <<"Please Enter a line"<< std::endl;
    while(std::getline(std::cin, line)){
        const char* s = line.c_str();
        while(*s){
            if (!ispunct(*s)){
                std::cout << *s;  // not as slow as you would think: buffered output
            }
            ++s;
        }
        std::cout << std::endl; // flush stdout, that buffering thing
    }
}

越简单越好。作为附带的好处,这也应该快一点。

代码没有输出任何内容的原因是因为它被卡在了getline循环中

假设c++11:

int main(){
  string line;
  cout <<"Please Enter a line"<< endl;
  getline(cin, line);
  line.erase(std::remove_if(line.begin(),  line.end(),  
               [](char ch) { return ispunct(ch) ? true : false; }), line.end());
  cout << line << endl;
  return 0;
}


这可以在没有任何循环的情况下完成。您只需要使用算法函数

通常,如果您有一个容器,并且您想要从容器中删除满足特定条件的项,那么如果您正在编写手工编码的循环,那么您将使用一种很长而且可能是错误的方法

下面是一个使用算法函数的示例,即std::remove\u if


活例子:

你试过调试你的代码吗?你所发布的代码有几个bug,甚至没有编译。是的,它在MSC++中编译,你可能遇到了在for for ROCKI中的部分的问题,不知道当我粘贴它时发生了什么。for循环头文件已经以正确的格式重新发布了。这样做有效,而且速度更快。我对c_str这句话很困惑,这意味着什么。同样感谢if语句中的代码,您可以提供关于它对输出的影响的简要解释。提前感谢td::string::c_str将常量char*返回到字符串的原始字节。您可以像对待任何其他常量C样式的字符*-解引用、递增等一样对待其返回值。它与金属尽可能接近。您的语句与CPU将执行的实际操作码的机器表示非常接近。另外,POST方法更有效,因为std::string::erase调用它的方式必须在内存中为每个标点符号字符向下洗牌字符串的整个剩余部分,而不是跳过它们。关于if语句和输出的问题-显然,我们只是检查每个字符,看看它是否是标点符号,如果是,我们跳过它。逐个字符的输出不是您可能认为的性能影响,因为iostream的输出是缓冲的-您只是在写入内存位置,直到刷新缓冲区为止,或者通过写入显式std::endl注意:不是'\n'字符-std::endl将'\n'写入流并刷新缓冲区,或者其他一些事件发生缓冲区满、关闭流等。您好,您在前面的脚本中帮助了我。但我有另一个脚本,它结合了这个脚本的各个方面,但将字符转换为大写。在这个网站上,如果我们使用您在这里演示的while循环来呈现一个字符串向量,那么您知道如何执行此代码吗?谢谢
int main(){
  string line;
  cout <<"Please Enter a line"<< endl;
  transform(line.begin(), line.end(), line.begin(), 
              [](char ch) {  return ispunct(ch) ? '\0' : ch; });
  cout << line << endl;
  return 0;
}
#include <algorithm>
#include <cctype>
#include <string>
#include <iostream>

using namespace std;

int main()
{
   std::string s = "This is, a, string: with ! punctuation.;";
   s.erase(std::remove_if(s.begin(), s.end(), ::ispunct), s.end());
   cout << s;
}