0

我正在开发一个最初在 C 中采样但想在 C++ 中进行的项目。

有一个部分使用了 strcat(),有人告诉我使用替代方法。我在这里找到了一个,但是当我尝试这些时,编译器给了我以下错误:

错误:char*' 类型的无效操作数char*' and到二进制 `operator+'

有什么我做错了吗?

编辑:

这是代码中不起作用的部分

FILE *FileOpen(string *fname, string* mode){
FILE *fp;
string *str = "";

str += "tmp/"; //all files to be created in temporary sub directory
str += fname;
if((fp=fopen(str,mode))==NULL){
fprintf(stderr,"Cannot open file: %s\n", &fname);
exit(1);
}
FileReader(fname);
return(fp);
}

编辑 2:对于那些想知道为什么我有 FileReader 的人:这是项目的第 2 部分。反汇编代码。

4

4 回答 4

1

你没有显示任何代码,但我怀疑你有这样的东西

char *s1 = "Hello, ", *s2 = "world!";
char buf[50];
strcpy(buf, s1);
strcat(buf, s2);

现在你把它改成了

char *s1 = "Hello, ", *s2 = "world!";
char buf[50];
buf = s1 + s2;

正如您已经注意到的那样,这不起作用。您还必须将 char 指针和 char 数组更改std::string

std::string s1 = "Hello, ", s2 = "world!";
std::string buf = s1 + s2;
于 2013-02-24T21:38:04.520 回答
1

感谢您发布代码;现在问题很明显了。

您应该使用字符串对象,而不是指向它们的指针。

FILE *FileOpen(string fname, string mode)
{
    string str = "";

    str += "tmp/"; //all files to be created in temporary sub directory
    str += fname;
    FILE *fp = fopen(str.c_str(), mode.c_str());
    if (!fp) {
        fprintf(stderr, "Cannot open file: %s\n", fname.c_str());
        exit(1);
    }
    FileReader(fname);
    return fp;
}

一个好的下一步是转向接受std::string参数的 I/O 函数,因此您不必.c_str()到处说。

我也很困惑为什么你有FileReader(fname)你的文件打开功能。这两次违反了单一职责原则。打开文件不应该导致它被读取,并且读取文件的代码应该使用 aFILE*并且不关心文件名是什么(除了可能生成错误消息)。

于 2013-02-24T21:45:06.910 回答
0

如果您的代码char *用作字符串,那么strcat可能是适合您的函数。当然,C++ 解决方案是std::string使用.+operator+std::string

于 2013-02-24T21:36:01.033 回答
0

好吧,C++ 有一个字符串类std::string,它的 operator+ 执行连接。但是你必须先创建一个。

所以表达式"abc" + "def"不能编译,但std::string("abc")+"def"工作正常。

或者你可以写一些像

std::string s("abc");
s += "def";

相似地,

std::string s = "abc";
s += "def";

如果您想连接大量文本并关心性能,请考虑使用std::ostringstream.

于 2013-02-24T21:38:56.073 回答