【问题标题】:C++ std::string length() or size() not working on method argsC++ std::string length() 或 size() 不适用于方法 args
【发布时间】:2012-11-04 10:15:04
【问题描述】:

我有一个方法可以从文件路径创建一个 MatLab 数组名称并将其作为 std::string 返回。结果字符串被传递到另一个将名称写入文件的方法中。当我尝试获取传入字符串的长度时,当字符串的长度为 12 或 13 个字符时,它显示 0。

我的代码:

bool MyClass::masterMethod(std::string fileURI){

 FILE* dataStream;
 // Assume dataStream is set up correctly

 // Get arrayName from File URI
 std::string arrayName = this->makeArrayNameFromPath( fileURI);

 //Write array name to file
 this->writeArrayName(arrayName , dataStream)



}


std::string MyClass::makeArrayNameFromPath(std::string filePathURI){


std::string tempString = filePathURI.substr(filePathURI.find_last_of('/')+1); 

std::string returnString = "";

long index = 0;

for(long i = 0; i < tempString.length(); i++){

    if((tempString[i] != ' ') && (tempString[i] != '.')){

        returnString[index++] = tempString[i];
    }
}

return returnString;

}



void MyClass::writeArrayName(std::string name , FILE *nameStream){

 // long testLength = name.length();
 // long testLength2 = name.size();
 // const char* testChar = nam.c_str();
 // long testCharLen = strlen(testChar);    

// The size of the name is the number of Chars * sizeof(int8_t)
int32_t sizeOfName = (int32_t)(name.length() * sizeof(int8_t));
int32_t nameType = miINT8;

fwrite(&nameType , sizeof(int32_t) , 1 , nameStream);
fwrite(&sizeOfName, sizeof(sizeOfName), 1, nameStream);
fwrite(&name , sizeof(name[0]), sizeOfName , nameStream);   

}

所以我不确定为什么 string::length 不起作用。如果创建一个 std::string test = name 并打印它,我可以得到字符串的值但不能得到它的长度或大小。 如果我使用 const char* testName = name.c_str(); long test = strlen(testName),我得到一个 正确的值,但认为没有必要。

因此,任何建议或建议都会受到赞赏。

【问题讨论】:

  • 您的数据有问题。如果length 返回 0,那么您有一个空字符串。该库没有错误——您的代码有。
  • 你的代码真的是这样的吗??请增强格式,这让我的眼睛流血......
  • 开始将字符串作为常量引用传递,因为复制可能很昂贵。
  • @ipc 虽然这通常是正确的,但另请参阅cpp-next.com/archive/2009/08/want-speed-pass-by-value
  • @MarkB:哎哟!!!另一个人陷入了误解。文章明确指出 if 您要在内部复制,您应该按值获取参数。 if 是关键点,如果它不会被复制(如本例所示),不要按值传递,因为您将付出代价不必要的副本。

标签: c++ macos stdstring


【解决方案1】:

你永远不会给字符串一个大小,只是试图分配不存在的位置。

试试这个,而不是在返回值中添加字符

returnString += tempString[i];

【讨论】:

  • 感谢您强调这一点。我可能在其他几个地方也犯了同样的错误,需要去寻找纠正它。
【解决方案2】:

returnString[index++] = tempString[i]; 不会做你认为的那样。它不会为字符串添加额外的空间或长度,只是在字符串实际上不拥有的位置覆盖内存。我认为returnString.append(1, tempString[i]) 或类似的应该这样做。

【讨论】:

  • 哎呀你的权利!我从未定义过新字符串的大小。这样就可以解释了。
猜你喜欢
  • 2011-09-24
  • 2010-10-28
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
相关资源
最近更新 更多