我想知道在c ++中制作以下内容的最佳方法。我有一个Parser和Gather课程;聚集使用解析器。
我在Parser类中有一个方法用三个参数解析我的文件:进程ID(int),路径(字符串,char,char * ... ???)和字符串格式(我也不知道哪个是最好的 - 字符串,常量字符串等...)。
最好在Parse.method中创建data []并返回它,或者传递对方法的引用,并将数据变量保存在collect类中?
char* ProcInfoParser::parseStatm(const int _processPid, std::string _path, std::string _strFormat) {
char path[32];
char* data[2042];
int tps = sysconf(_SC_CLK_TCK);
int fd = open(path, O_RDONLY);
if (fd < 0) {
perror("open");
return "-1"; //wrong...
}
if (read(fd, data, 2048) == -1) {
perror("read");
return "-1"; //wrong...
}
close(fd);
char name[1024];
long unsigned int utime, virt;
long int rss;
sscanf(data, "%*d %s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %lu"
" %*u %*d %*d %*d %*d %*d %*d %*u %lu %ld", name, &utime, &virt, &rss); //Iwish to use the _stringFormat variable here...
return data;
}
我真的不知道在char(char * ...)或string之间选择哪一个;我还想创建一个带有进程ID的路径,如string.Format(“/ proc /(0)/ statm”,processID); sprintf 功能是这样的吗?也许我应该看看提升......
提前致谢
答案 0 :(得分:1)
(我也不知道哪个最好 - 字符串,const字符串等...)。
使用“const”限定符,您可以将参数指定为“常量”:因此您不会更改参数。当按值传递参数时,这几乎没有用处:无论如何都会在函数的持续时间内进行临时复制。
另一方面,通过引用传递参数,正确地考虑const-keyword变得很重要:
基本上:std :: string优于字符数组,除非您有使用字符数组的特定原因。虽然这通常属于微观优化。
当返回一个字符数组时,你负责制作一个垃圾收集方案,你必须在堆上声明数组。外部清洁。
在您发布的代码中,您通过返回指向本地变量的指针来违反此行为。
我让函数签名看起来像,帮自己一个忙,防止指针出现问题:
std::string ProcInfoParser::parseStatm(int _processPid, const std::string& _path, const std::string& _strFormat);
答案 1 :(得分:0)
这里有几个问题:
char* data[2042];
是一个指针数组。我不认为这就是你想要的,你想要一组char
s,这将是:
char data[2042];
此外,您传递std::strings
并返回char*
,这不是真正一致的。如果您返回std::string
- 您将不会遇到任何问题。您可以按值传递它,并将其保存在拥有它的类中。
最后但并非最不重要 - 您正在返回指向本地变量的指针,该变量在退出函数时不存在,这是一个麻烦的方法。返回std::string
也可以解决问题。
底线 - 你在这里混合使用C和C ++代码。虽然C ++允许这样做,但它通常是错误和错误的常见来源。为什么不使用C ++流和字符串?