0

我从我的程序中粘贴了一部分代码片段,代码的输出给出了一些不需要的字符,请查看它并让我知道其背后的明显逻辑原因。

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!

ýýýý««««««««îþ

4

3 回答 3

0

一切都在意料之中。您的字符串没有空终止符。

于 2012-07-05T10:49:10.590 回答
0

formatForHtml返回char*非空分隔的 a。你必须附加0到它:

st.resize(strBegin.size() + 1);
...
st.push_back('\0');

而不是返回char*,我宁愿返回std::string并使用procString.c_str()来获取原始数据以写入文件。

于 2012-07-05T10:55:30.730 回答
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];
}
};
于 2012-07-05T10:57:56.743 回答