在 C++ 中将字符数组添加到常量字符数组的正确方法是什么?

What's the correct way to add a character array to a constant character array in C++?

本文关键字:字符 数组 方法 是什么 C++ 添加 常量      更新时间:2023-10-16

在C++中将字符数组添加到常量字符数组中的正确方法是什么?

#include <iostream>
using namespace std;
int main(int argc, char** argv) {
    int pathSize = 0;
    char* pathEnd = &argv[0][0];
    while(argv[0][pathSize] != '') {
        if(argv[0][pathSize++] == '/')
            pathEnd = &argv[0][0] + pathSize;
    }
    pathSize = pathEnd - &argv[0][0];
    char *path = new char[pathSize];
    for(int i = 0; i < pathSize; i++)
        path[i] = argv[0][i];
    cout << "Documents Path: " << path + "docs/" << endl; // Line Of Interest
    delete[] path;
    return 0;
}
此代码输出:文档路径:�\使用"path"而不是"*path"将导致编译错误:类型为"char*"answers"const char[6]"到二进制"operator+"的无效操作数

我可以建议首先使用C++和(Boost)文件系统来获得最大的好处吗:

#include <iostream>
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;
int main(int argc, const char *argv[])
{
    const std::vector<std::string> args { argv, argv+argc };
    path program(args.front());
    program = canonical(program);
    std::cout << (program.parent_path() / "docs").native();
}

这将使用平台的路径分隔符,知道如何翻译"有趣"的路径(例如,包含....或UNC路径)。

应该这样做(完全未经测试):

const char* end = strrchr(argv[0], '/');
std::string docpath = end ? std::string(argv[0], end) : std::string(".");
docpath += '/docs/';

您的方式:

#include <iostream>
using namespace std;
int main(int argc, char** argv) {
    int pathSize = 0;
    char* pathEnd = &argv[0][0];
    while(argv[0][pathSize] != '') {
        if(argv[0][pathSize++] == '/')
            pathEnd = &argv[0][0] + pathSize;
    }
    pathSize = pathEnd - &argv[0][0];
    char *path = new char[pathSize + 5]; //make room for "docs/"
    for(int i = 0; i < pathSize; i++) 
        path[i] = argv[0][i];
    char append[] = "docs/";
    for(int i = 0; i < 5; i++) 
        path[pathSize+i] = append[i];
    cout << "Documents Path: " << path << endl;
    function_expecting_charptr(path);
    delete[] path;
    return 0;
}

Sane C方式:

#include <iostream>
using namespace std;
int main(int argc, char** argv) {
    char* pathEnd = strrchr(argv[0], '/');
    if (pathEnd == NULL)
        pathEnd = argv[0];
    int pathSize = (pathEnd-argv[0]) + 5; //room for "docs/"
    char *path = new char[pathSize];
    if (pathSize)
        strncpy(path, argv[0], pathSize+1);
    strcat(path, "docs/");
    cout << "Documents Path: " << path << endl;
    function_expecting_charptr(path);
    delete[] path;
    return 0;
}

C++方式:

#include <iostream>
#include <string>
int main(int argc, char** argv) {
    std::string path = argv[0];
    size_t sep = path.find('/');
    if (sep != std::string::npos)
        path.erase(sep+1);
    else
        path.clear();
    path += "docs/";
    std::cout << "Documents Path: " << path << endl;
    function_expecting_charptr(path.c_str());
    return 0;
}

请注意,argv[0]持有一个实现定义的值,尤其是在*nix环境中,不能保证持有任何有用的值。传递给程序的第一个参数位于argv[1]中。

我把你们的一些想法组合成了这个紧凑的代码:

#include <iostream>
#include <cstring>
using namespace std;
int main(int argc, char** argv) {
    const string path_this = argv[0];
    const string path = path_this.substr(0, strrchr(argv[0], '/') - argv[0] +1);
    const string path_docs = path + "docs/";
    cout << "Documents Path: " << path_docs << endl;
    return 0;
}

要从中获取字符数组,我可以运行"path_docs.c_str()".

署名:@MooingDuck,@MarkB,谷歌。