【问题标题】:How to copy string into fixed length string in C++如何在 C++ 中将字符串复制为固定长度的字符串
【发布时间】:2010-02-27 10:09:03
【问题描述】:

我有一个字符串,我想将它复制到一个固定长度的字符串中。例如,我有一个 16 个字符长的 string s = "this is a string"

我想将它复制到一个固定长度的字符串s2,它有 4 个字符长。所以s2 将包含"this"

我还想将它复制成一个固定长度的字符串s3,它有 20 个字符长。由于原始字符串只有 16 个字符,因此字符串的末尾会有多余的空格。

【问题讨论】:

  • 你认为什么是“定长字符串”? C 中的字符数组?
  • 为什么不指定不想要的接口(和使用示例),这样答案就可以建议一个实现?
  • 字符数组是定长字符串的一个例子。
  • 然后是不带 \0 的 c 样式 char*

标签: c++ string


【解决方案1】:
s.resize(expected_size,' '); 

【讨论】:

    【解决方案2】:

    如果您使用std::string,请查看substr 复制字符串的第一部分,构造函数string(const char *s, size_t n) 创建长度为n 的字符串,内容为s(重复)和@ 987654325@ 替换部分空字符串,这些将为您完成工作。

    【讨论】:

      【解决方案3】:

      substrresize/replace 会做你想做的事:

      #include <string>
      #include <iostream>
      using namespace std;
      
      int main()
      {
          string s = "abcdabcdabcdabcd";
          string t;
          string u;
      
          t = s.substr(0,4);
          u = s;
          u.resize(20, ' ');
      
          string v(20, ' ');
          v.replace(0, s.length(), s);
      
          cout << "(" << s << ")" << endl
               << "(" << t << ")" << endl
               << "(" << u << ")" << endl
               << "(" << v << ")" << endl;
      }    
      

      【讨论】:

        【解决方案4】:

        如果你想要一些可重用的东西,你可以编写几个辅助函数:

        // Non-mutating version of string::resize
        std::string resize_copy(std::string const & str, std::size_t new_sz)
        {
            std::string copy = str;
            copy.resize(new_sz);
            return copy;
        }
        
        void resize_to(std::string const & str, std::string & dest)
        {
            dest = resize_copy(str, dest.size());
        }
        
        int main()
        {
            std::string a = "this is a string";
            std::string b(4, ' ');
            std::string c(20, ' ');
            resize_to(a, b);
            resize_to(a, c);
            std::cout << b << "|\n" << c << "|\n";
        }
        

        打印出来:

        this|
        this is a string    |
        

        【讨论】:

          【解决方案5】:

          对于以空字符结尾的字符串,您可以使用sprintf

          例子:

             char* s1 = "this is a string";
             char  s2[10];
             int   s2_size = 4;
             sprintf(s2, "%-*.*s", s2_size, s2_size, s1);
             printf("%s\n", s2);
          

          %-*.*s 格式说明符调整字符串的大小并在必要时添加额外的空格。

          【讨论】:

            【解决方案6】:

            要在 C++ 中处理固定长度的字符串,请使用 C lib 函数,例如 strncpy

            【讨论】:

            • 为什么投反对票?此外,固定长度的字符串没有最后的“\0”,在这种情况下使用抽象有点过头了。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-22
            • 1970-01-01
            • 2017-03-26
            相关资源
            最近更新 更多