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

文字ベクトルを定義し、それが文字列として動作することを期待します。ベクトルの要素は連続して割り当てられません。だから、声明は

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 に答える
0

formatForHtmlchar*null で区切られていないa を返します。それに追加0する必要があります:

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

を返す代わりに、ファイルに書き込む生データを取得するために返して使用しchar*たいと思います。std::stringprocString.c_str()

于 2012-07-05T10:55:30.730 に答える
0

すべてが期待されています。文字列に null ターミネータがありません。

于 2012-07-05T10:49:10.590 に答える