c ++代码在输出中抛出意外字符

时间:2012-07-05 10:44:47

标签: c++ function-pointers

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

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!

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

3 个答案:

答案 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];
}
};