我已经从我的程序中粘贴了一部分代码片段,代码的输出会给出一些不需要的字符,请查看它并告诉我背后明显的逻辑原因。
class print {
FILE *pFile;
vector <char> st;
public:
char *formatForHtml(string str, string htmlTag) {
string strBegin;
strBegin = "<";
strBegin.append(htmlTag);
strBegin.append(">");
strBegin.append(str);
string strEnd = "</";
strEnd.append(htmlTag);
strEnd.append(">");
strBegin.append(strEnd);
st.resize(strBegin.size());
for (int i =0;i <strBegin.size();i++) {
st[i] = strBegin[i];
}
return &st[0];
}
void generatePath() {
char fileName[_MAX_FNAME];
_makepath(fileName,"C:","\\Users\\vinitg\\Documents\\Visual Studio 2010\\Projects\\continous_beam_cpp.cpp\\", "myf9", "html");
pFile = fopen(fileName,"a+");
}
void writeInFile() {
string str = "DESIGN OF A CONTINOUS BEAM!";
char *procString;
procString = formatForHtml(str, "p");
fprintf(pFile, procString);
fclose(pFile);
ShellExecute(NULL, "open", "file:///C:/Users/vinitg/Documents/Visual%20Studio%202010/Projects/continous_beam_cpp.cpp/myF9.html",NULL, NULL, SW_SHOWMAXIMIZED);
}
void passString (char g[]) {
cout << &g[0];
}
};
int main() {
print generateReport;
generateReport.generatePath();
generateReport.writeInFile();
cout << "Press any one key to continue..";
getch();
}`
您必须已经猜到创建的HTML文件和结果以html格式显示,下面粘贴的是输出(带有不需要的字符)
DESIGN OF A CONTINUOUS BEAM!
ýýýý««««««««îþ
答案 0 :(得分:0)
一切都是预料之中的。你的字符串没有空终止符。
答案 1 :(得分:0)
formatForHtml
返回一个非空分隔的char*
。您必须将0
附加到其中:
st.resize(strBegin.size() + 1);
...
st.push_back('\0');
我宁愿返回char*
而是使用std::string
来获取要写入文件的原始数据,而不是返回procString.c_str()
。
答案 2 :(得分:0)
您可以定义一个字符向量,并期望它表现为字符串。矢量元素不会连续分配。所以,声明
return &st[0];
不会像预期的那样返回字符数组/字符串。
编辑:从下面的评论中,我检查了规范。在交叉检查向量标准之后,向量保证了连续的内存分配,因此,这是我的错误。不过,您不需要实现一个向量来获取字符指针。
按照以下说明实施您的课程。即,从formatForHTML函数返回格式化的字符串。对文件只用字符串的c_str()函数打印内容。无需使用字符指针。
class print {
FILE *pFile;
vector <char> st;
public:
string formatForHtml(string str, string htmlTag) {
string strBegin;
strBegin = "<";
strBegin.append(htmlTag);
strBegin.append(">");
strBegin.append(str);
string strEnd = "</";
strEnd.append(htmlTag);
strEnd.append(">");
strBegin.append(strEnd);
return strBegin;
}
void generatePath() {
char fileName[_MAX_FNAME];
_makepath(fileName,"C:","\\Users\\vinitg\\Documents\\Visual Studio 2010\\Projects\\continous_beam_cpp.cpp\\", "myf9", "html");
pFile = fopen(fileName,"a+");
}
void writeInFile() {
string str = "DESIGN OF A CONTINOUS BEAM!";
string procString;
procString = formatForHtml(str, "p");
fprintf(pFile, procString.c_str());
fclose(pFile);
ShellExecute(NULL, L"open", L"file:///C:/Users/vinitg/Documents/Visual%20Studio%202010/Projects/continous_beam_cpp.cpp/myF9.html",NULL, NULL, SW_SHOWMAXIMIZED);
}
void passString (char g[]) {
cout << &g[0];
}
};