c ++奇怪的字符串大小

时间:2013-08-29 01:04:57

标签: c++ string

我遇到了一个奇怪的字符串大小问题。这是我的示例代码

sampleA

std::string getexepath()
{
    char result[ PATH_MAX ];
    int found;
    ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX );
    found = std::string(result).find_last_of("/");
    std::string pp = std::string(result).substr(found+1);
    std::string kk = std::string(result).substr(found+1);
    std::cout << kk << kk.size() << std::endl;
    return kk;
}

sampleB

std::string getexepath()
{
    char result[ PATH_MAX ];
    int found;
    ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX );
    found = std::string(result).find_last_of("/");
    //std::string pp = std::string(result).substr(found+1);
    std::string kk = std::string(result).substr(found+1);
    std::cout << kk << kk.size() << std::endl;
    return kk;
}

输出不同; sampleB输出比sampleA多2个char。我猜差异是'\0'; sampleB输出包括'\0',而sampleA不包括。

我想知道导致问题的原因。 在回答了答案之后,现在我知道我错过了'\ 0'。但我仍然想知道为什么添加这个语句“std :: string pp = std :: string(result).substr(found + 1)”会导致差异结果。

由于

2 个答案:

答案 0 :(得分:2)

你猜是对的。问题是您忘了设置result[count]=0。因此,您的代码具有未定义的行为,因为char数组result不会被'\ 0'终止。

添加

    result[count] = 0;

found = ...之前,您将获得样本A和样本B的相同结果。

答案 1 :(得分:1)

堆栈上result[ PATH_MAX ]的内存未初始化,因此结果的内容未经确认。像WhozCraig的评论一样:

  

readlink()不会向buf附加空字节。

所以'{0'可能出现在result[ count-1 ]之后的每个地方,并且代码中的输出是未定义的。声明C格式字符串时,我们最好初始化字符串,如下所示:char result[ PATH_MAX ] = {0};。希望这些可以帮助你。