【问题标题】:Append integer to end of const char* c++将整数附加到 const char* c++ 的末尾
【发布时间】:2011-04-06 21:35:55
【问题描述】:

我有const char* FilePathName,看起来像这样:C:\ImportantFile.hex
还有一个int id = 12345;
我需要定义一个新的 const char* FilePathName_ID,它将带有下划线的 id 附加到原始的 FilePathName 看起来像这样:C:\ImportantFile_12345.hex
我看过this,但它不同,因为我使用的是 const char*,这给了我错误cannot convert from 'const char * ' to 'char',需要一个下划线。
我需要得到一个 const char*
EDIT 我需要保留文件扩展名。

【问题讨论】:

    标签: c++ visual-studio char append


    【解决方案1】:

    您需要创建一个新的std::string 对象或一个以null 结尾的字节字符串。一种简单的方法是:

    std::string append_number(std::string const& x, unsigned int num, char sep = '_') {
        std::stringstream s;
        s << strip_extension(x) << sep << num;
        return s.str();
    }
    

    您可以无缝地将字符串文字传递给上述函数。

    更新:我注意到您可能还需要删除扩展名:

    std::string strip_extension(std::string x, char ext_sep = '.') {
         return x.substr(0, x.find_last_of(ext_sep));
    }
    
    std::string get_extension(std::string const& x, char ext_sep = '.') {
         return x.substr(x.find_last_of(ext_sep) + 1); // no error checking 
    }
    

    查看append_number 的更新定义。

    更新 2:尝试以下程序:

    #include <string>
    #include <iostream>
    #include <sstream>
    
    std::string strip_extension(std::string const& x, char ext_sep = '.') {
         return x.substr(0, x.find_last_of(ext_sep));
    }
    
    std::string append_number(std::string const& x, unsigned int num, char sep = '_') {
            std::stringstream s;
            s << strip_extension(x) << sep << num << '.' << get_extension(x);
            return s.str();
        }
    
    int main() {
      std::cout << append_number("file.hex", 45) << std::endl;
    }
    

    输出应该是:

    file_45.hex
    

    【讨论】:

    • 我最后需要一个 const char*。
    • @Nick S.:这很简单:const char *s = append_number( ... ).c_str()。用您自己的变量填写...
    • 您可以在末尾简单地调用c_str() 以获取const char *
    • @dirkgently 谢谢,我忘了添加现在修复的扩展。我会试试这个。
    • s&lt;&lt;sep&lt;&lt;x; 我想应该是s&lt;&lt;sep&lt;&lt;num
    【解决方案2】:
     ostringstream oss;
     oss << FilePathName << "_" < id;
     const char* FilePathNameID = oss.str().c_str();
    

    【讨论】:

      【解决方案3】:

      注意:任何通过 'c_str()' 从 std::string 返回的 const char * 只有在 std::string 在范围内时才有效。您可以获得指针,但字符串消失后它将成为垃圾。

      您应该能够将 char * 传递给采用 const char * 的函数 - 听起来主要问题可能是创建/保持有效指针。

      【讨论】:

      • 我认为这是我遇到问题的地方。
      • 实现此目的的一种非常骇人听闻的方法是创建 std::string 的全局实例并使用上述解决方案之一来设置其内容。在此之后,指针应保持有效。但是,我建议您尝试了解范围问题,或者在适当的情况下更改为使用通过引用或值传递的 std::strings。
      【解决方案4】:

      正如mikerobi所说,你可以使用sprintf来处理它:

      char szAppended[MAX_PATH+10]; // ensure to have enough space for the path and ID
      char szNoExt[MAX_PATH];
      strcpy(szNoExt, FilePathName);
      char *pExt = strrchr(szNoExt, '.');
      *pExt = '\0';
      sprintf(szAppended, "%s_%d.%s", szNoExt, id, pExt + 1);
      

      您可能还应该添加一些内存检查以检查扩展是否存在。

      【讨论】:

        猜你喜欢
        • 2017-07-10
        • 2013-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-17
        • 1970-01-01
        • 2017-06-15
        • 2012-10-08
        相关资源
        最近更新 更多