【问题标题】:how can I copy some characters into string in c++如何在c ++中将一些字符复制到字符串中
【发布时间】:2014-12-16 18:13:27
【问题描述】:

在我的代码的一部分中,我应该一个一个地获取字符。这很容易,但我的问题是如何将这些字符一一添加到字符串中。请注意,我不知道我会得到多少个字符。 重要的是仅将字符复制到字符串中。换句话说,我想从字符生成单词,直到字符不等于 ' ''\n' 。 我写的错误代码是:

 char c;
 string str = NULL;
 cin.get(c);
 while (c != " ")
 {
      str += c;
      cin.get(c);
 }
 cout << str ; 

例如,如果字符 c 首先是 'H',然后是 'i', 我希望字符串 str 在 cout 上成为 "Hi"

【问题讨论】:

  • 为什么是string str = NULL; 而不仅仅是string str;?这不是char*
  • 好的,我改了,但是代码也错了。
  • @0bijanmortazavi 请不要接受一个答案,直到你确定它符合你的需要,然后我鼓励你不要改变你接受的答案。

标签: c++ string copy character


【解决方案1】:

=!应该是!=,字符串" "应该是一个字符' '

如果你想检查换行符和空格:

while (c != ' ' && c != '\n')

或许

while (!std::isspace(c))

它将读取任何空白字符。

您还应该检查流的结尾或其他问题:

while (cin.get(c) && !std::isspace(c)) {
    str += c;
}

【讨论】:

  • str += c 会这样做。
  • 不,这是错误的,我有很多 c 字符并且 str 的长度没有给出
  • 它在一个循环中,所以每次它都会在字符串中附加一个不同的字符(你刚刚从cin读取的那个)。你最终会得到字符串中的所有输入字符(直到第一个空格),就像你想要的那样。
【解决方案2】:

如果您只想阅读到空格或换行符:

std::getline( cin, str, ' ' );

【讨论】:

  • 不。 std::getline 在默认分隔符 (\n) 或您提供的分隔符处停止,而不是两者都停止。例如,考虑这段代码并输入:ideone.com/rMLH5G 结果应该只是“Foo”
【解决方案3】:

c++ stringstreams 在构建字符串时也很有用

stringstream ss;
while (cin.get(c) && !std::isspace(c)) {
    ss << c;
}
string s = ss.str();
cout << s;

【讨论】:

    【解决方案4】:

    如果你的 str 开始是空的,这很简单:

    string str;
    
    cin >> str; // cin's >> operator already reads until whitespace
    
    cout << str;
    

    【讨论】:

    • 我必须使用 char 变量一个一个地给字符!好吗?
    • @0bijanmortazavi 我不确定你为什么要这样做,但如果这是你想要的,那么Mike Seymour 的答案是一个很好的答案。
    • 如何将字符复制或添加到字符串中?这是我现在的问题。请帮帮我
    • @0bijanmortazavi 如果您愿意在提示符下输入整行然后按回车键,我的代码将使用cinoperator&gt;&gt; 将第一个单词放入str。如果您需要逐字阅读,Mike Seymour 使用 stringoperator+= 将进行复制。
    【解决方案5】:

    您的代码中的错误是您没有检查换行符。 此外,它应该是 != 而不是 =!。第二个选项实际上在您的代码中表现为c = (!(" "))。另一个错误是您应该检查空格字符 ' ' 而不是空字符串 " "

    这是正确的代码:

    char c;
    string str = "";
    while (true)
    {
         cin.get(c);
         cout << "c is " << c << endl;       
             if ((c == ' ') || (c == '\n'))
         break;
         str += c;
    }
    cout << str << endl ; 
    

    另外,如果您的要求是在遇到空格字符时停止 I/O,请参考以下问题:C - Reading from stdin as characters are typed

    此处提出的所有解决方案都将继续读取输入,直到输入换行符为止,因为在此之前您的输入尚未被处理,而是存储在缓冲区中。

    【讨论】:

    • Obijan mortazavi : 抱歉,我在代码中犯了一些愚蠢的错误。我知道这是不可接受的,但在我的辩护中,这里是凌晨 4 点。无论如何,这段代码应该可以解决问题。但是,您仍然需要按 Enter,因为 I/O 不会在空格后停止。但最终返回的答案只包含数据,直到第一个空格。
    • 问题不在while !!!如何在字符串中逐个复制或添加字符?
    • Obijan mortazavi : str += c 在字符串 str 的末尾添加一个字符。换句话说,str += c 与 str = str + c 相同。循环中的 get 将继续一个一个地读取字符。
    【解决方案6】:

    如果你事先不知道它会有多少个字符,我会声明一个 std::list,将元素推送到它,然后将它们复制到一个字符串中。这可确保您不会在每次添加时重新分配字符串内存:

    char c;
    list<char> buff;
    cin.get(c);
    while (c != ' ' && c != '\n')
    {
        buff.push_back (c);
        cin.get(c);
    }
    string str (buff.size(), 0);
    size_t i = 0;
    while (!buff.empty())
    {
        str[i] = buff.front();
        buff.pop_front();
        ++i;
    }
    cout << str ;
    

    【讨论】:

    • 行“std::list buff;”有一个错误可能是图书馆的。请帮帮我
    • 什么样的错误?你在标题中#include &lt;list&gt; 了吗?
    • 非常感谢,但是这行 "std::string str (buff.size());" 有一个新错误我认为这是针对尺寸类型的
    • 对,字符串声明有错误。我会解决的。
    • 请给我一个代码,以便将字符一个一个复制或添加到字符串中
    猜你喜欢
    • 2022-11-30
    • 2012-05-09
    • 2020-08-02
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2019-12-08
    相关资源
    最近更新 更多