【问题标题】:Get string from console but don't know the length从控制台获取字符串但不知道长度
【发布时间】:2013-05-23 01:32:38
【问题描述】:

我要求用户在控制台上输入一个字符串。但我不知道字符串的长度

如何定义一个结构以适应具有可变长度的输入?

int main(){
    int i;
    char s[10];

    cout << "input string:";
    cin >> s;

    return 0;
}

如果输入字符串长度超过10,示例代码将导致堆损坏。

【问题讨论】:

    标签: c++ string input iostream


    【解决方案1】:

    请改用std::string。例如:

    #include <string>
    
     std::string s;
    
     std::cout << "input string:";
     std::cin >> s;
    

    或者使用 std::getline 获取一行直到结束符

    std::getline(std::cin, s);
    

    【讨论】:

    • 这假定字符串没有空格。
    • 因为“字符串”类在标准中。为什么我们需要包含 头文件?
    • @Zack 因为std&lt;string&gt; 中声明(c:
    • @Zack 不要出汗。 std::string&lt;string&gt; 中。这是在标准中定义的。
    • @Zack 我添加了一个适用于包含空格的字符串的答案。
    【解决方案2】:

    这是一个有效的通用示例,可​​让您读取包含空格的字符串:

    #include <string>
    #include <iostream>
    int main()
    {
      std::string s;
      std::cout << "Type a string\n";
      std::getline(std::cin, s);
      std::cout << "You just typed \"" << s << "\"\n";
    }
    

    【讨论】:

      【解决方案3】:

      基本上,建议您始终使用 std::string 来获取可变长度输入。仍然,如果您需要将输入存储在数组中以将其传递给函数或其他东西。你可以去做这个。虽然它很蹩脚。

      /* #include <string> */
      std::string s;
      std::cout<<"Enter the String";
      std::getline(std::cin, s);
      char *a=new char[s.size()+1];
      a[s.size()]=0;
      memcpy(a,s.c_str(),s.size());
      std::cout<<a;  
      

      问候

      Genocide_Hoax

      【讨论】:

      • 为什么要 memcpy 到一个单独的 cstring?可以使用 s.c_str() 轻松地将其传递给函数...
      • s.c_str() 将其转换为 const char *。因此,万一编码人员以后想操作数组,他可以使用它。
      • true,但您不知道编码器稍后想要操作字符串。我认为这可能会导致一些混乱......
      • 好吧,在这点上,编写灵活的代码总是更好。我想解决方案 s.c_str() 已经发布了。所以,我想给它增加一些灵活性。只是为了帮助那些可能想要将输入转换为可变或更灵活的 char 数组的人。
      【解决方案4】:

      cplusplus.com 表示输入流中字符串的 >> 运算符使用空格作为分隔符。所以如果你需要你的字符串能够包含空格,你必须使用std::getline(...) (这与 istream::getline(...) 不同!!!!)

      基本上是这样的:

      std::string inputString;
      
      std::getline(cin, inputString);
      

      我的回答受到this answer的启发

      【讨论】:

        【解决方案5】:
        #include <iostream>
        #include <string>
        using namespace std;
        
        int main(){
            int i;
            string s;
        
            cout << "input string:";
            cin >> s;
        
            return 0;
        }
        

        使用 std::string 代替 char[]。

        如果需要在输入后使用char[],可以参考这些问题:

        std::string to char*

        convert string to char*

        例如,

        string s1;
        cin >> s1;
        
        char *s2;
        s2 = new char[s1.length() + 1]; // Including \0
        strcpy(s2, s1.c_str());
        
        delete []s2;
        

        不了解new和delete的可以使用malloc和free。

        【讨论】:

        • 字符串类在 std 命名空间中定义。所以不需要包含“字符串”头文件。
        • @Zack 我很确定可以在不同文件的同一个命名空间中声明不同的东西。或者,命名空间的成员可以在不同的文件中声明
        • @matt 这真的很有趣!我没有意识到 std 是在不同的文件中定义的。奇怪!
        • 是的,std 只是一个命名空间,而不是一个类,命名空间只是用于顾名思义,对一组声明进行分组。整个库、api、引擎,以及在各自的头文件中声明的不同类的负载,可以放在同一个命名空间中。命名空间用于整齐地对声明进行分组,并防止它们与其他包含库的同名声明等冲突。它优于将库名称附加到每个声明的开头,因为您可以使用 'using' 关键字来缩短名称。
        【解决方案6】:

        在 c++ 中,您应该使用std::string 而不是 char[],尤其是对于可变长度字符串。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-28
          相关资源
          最近更新 更多