0

独学で C++ を学んでいて、重要な何かが欠けていることはわかっていますが、それが何であるかを一生理解することはできません。

コードの巨大なブロックを許してください。私はそれを重要な要素に切り詰めたいと思いましたが、そのままにしておくと、皆さんは私のコーディングスタイルについて他の教育的批判をするかもしれないと考えました...

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

//  main routine
int main(int argc, char *argv[]) {
    // will store filetype here for later
    string filetype = "";
    string filename;

    // if no arguments, die.
    if (argc < 2) {
        cout << "ERROR: Nothing to do." << endl;
        return 1;
    }

    // if more than one argument, die.
    else if (argc > 2) {
        // TODO: support for multiple files being checked would go here.
        cout << "ERROR: Too many arguments." << endl;
        return 1;
    }

    // otherwise, check filetype
    else {
        string filename = argv[1];
        cout << "Filename: " << filename << endl;
        //searching from the end, find the extension of the filename
        int dot = filename.find_last_of('.');
        if (dot == -1){
            // TODO: Add support for filenames with no extension
            cout << "ERROR: Filename with no extension." << endl;
            return 1;
        }
        string extension = filename.substr(dot); 
        if (extension == ".htm" || extension == ".html"){
            filetype = "html";
        }
        else if (extension == ".c"){
            filetype = "c";
        }
        else if (extension == ".c++" || extension == ".cpp") {
            filetype = "cpp";
        }
        else {
            cout << "ERROR: unsupported file extension" << endl;
            // TODO: try to guess filetype from file headers here
        }
    }

    cout << "Determined filetype: " << filetype << endl;
    cout << "Filename: " << filename << endl;

    return 0;
}
                                            // All done :]

私が抱えている問題は謎です。渡された引数を次のように文字列に入れます。

string filename = argv[1];

次に、拡張子を検索します。最後から始めて、最初に進みます。

int dot = filename.find_last_of('.');
string extension = filename.substr(dot);

これはすべて期待どおりに機能しますが、その後、ファイル名を出力しようとすると、不思議なことに空になりますか? coutでデバッグしてみました。検索する前に文字列を印刷すると、正しく印刷されます。その後、何も印刷されません。そのようです:

$ g++ test.cpp -o test.out; ./test.out foo.html
Filename: foo.html
Determined filetype: html
Filename:

過去にイテレータについて何かを思い出し、filename.begin()それをリセットするために使用しようとしましたが、これは何もしませんでした。誰かがこの不可解な問題に光を当てることができますか?

4

1 に答える 1

3

の後に、ここで filename という 2 番目の変数を宣言していますelse

string filename = argv[1];

これは、ここに到達するまでに範囲外になります。

 cout << "Filename: " << filename << endl;

と宣言した 1 番目の変数の内容を のfilenameすぐ下に出力してmainいます。

于 2012-04-15T02:44:42.947 に答える