gpt4 book ai didi

C++ 如何将可变字符数组从一个函数传递到另一个函数

转载 作者:行者123 更新时间:2023-11-28 00:55:29 24 4
gpt4 key购买 nike

我有一个关于将 char 数组变量从一个函数传递到下一个函数的问题。

以下是相关代码示例:

int main( int argc, char** argv )
{

int value = 0;

int nCounter = 0;
FILE* fIn = NULL;
char * sLine = new char[MAX_FILENAME_SIZE];
char * sFileName = new char [MAX_FILENAME_SIZE];
char * s = new char [MAX_FILENAME_SIZE];



if ((fIn = fopen(ImgListFileName,"rt"))==NULL)

{
printf("Failed to open file: %s\n",ImgListFileName);
return nCounter;
}



while(!feof(fIn)){

//set the variables to 0
memset(sLine,0,MAX_FILENAME_SIZE*sizeof(char));
memset(sFileName,0,MAX_FILENAME_SIZE*sizeof(char));
memset(s,0,MAX_FILENAME_SIZE*sizeof(char));
//read one line (one image filename)
//sLine will contain one line from the text file
fgets(sLine,MAX_FILENAME_SIZE,fIn);
//copy the filename into variable s
strncpy(s, sLine, strlen(sLine)-1);
//put a \0 character at the end of the filename
strcat(sLine,"\0");
//create the filename
strcat(sFileName,s);

nCounter++;


fclose(fIn);
delete sLine;
delete sFileName;
delete s;
const int size = 60;
char path[size] = "path";
strcat(path,sFileName);

printf (path);
IplImage *img = cvLoadImage(path);
detect_and_draw(img);
cvWaitKey();
cvReleaseImage(&img);
cvDestroyWindow("result");

void detect_and_draw( IplImage* img )
{


More code that isn't involved....


cvSaveImage(sFileName, img);

现在,我尝试了以下方法:

void getFilename(char * sFileName)
{
printf("The filename is %s\n", sFileName);
return;
}

然后调用

char * S ="string"
getFilename(S);
cvSaveImage(S,img);

但是“字符串”被放入“文件名是:字符串”。

我该怎么做才能在 cvSaveImage(sFileName, img) 中使用字符数组 sFileName?

提前致谢,如果您需要任何进一步的说明,请询问!

最佳答案

忽略未定义的行为、不必要的动态分配等,您似乎要完成的事情归结为以下一般顺序:

std::string path;

while (std::getline(fIn, path)) {
std::cout << "path: " << path;

IplImage *img = cvLoadImage(path.c_str());

detect_and_draw(img, path);
cvWaitKey();
cvReleaseImage(&img);

cvDestroyWindow("result");
}

void detect_and_draw(IpImage *img, std::string const &path) {
// ...
cvSaveImage(path.c_str(), img);
}

不过我想我会做一些与此不同的事情——可能从一个 Image 类开始,比如:

class Image { 
IpImage *img;
std::string path;

public:
Image(std::string const &name) :
img(cvLoadImage(name.c_str()), path(name)
{ }

~Image() { cvReleaseImage(&img); }

void detect_and_draw() {
// ...
cvSaveImage(path);
}
};

使用它,您的代码看起来更像这样:

while (std::getline(fIn, path)) {
Image img(path);
img.detect_and_draw();
cvWaitKey();
cvDestroyWindow("result");
}

还不是很清楚,但是 cvDestroyWindow 听起来很像真正属于析构函数的东西,但我不确定这些部分是如何组合在一起的,无法确定析构函数 - - 也许是 Image 的,更有可能是其他的。

我注意到 detect_and_draw 实际上是在尖叫“这段代码忽略了单一责任原则”。它在名称中列出了两项职责,而且似乎至少还有三分之一(保存文件)。

关于C++ 如何将可变字符数组从一个函数传递到另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11638347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com