2012-04-15 3 views
0

自分自身をC + +で教え​​て、私は批判的なものが欠けていることを知っていますが、私の人生はそれが何であるかを理解できません。 ...find_last_of()およびsubstr()の後に文字列が空になりますか?

は、コードの巨大なブロックを許して、私は重要な要素にそれをダウントリムするように誘惑されたが、私はそれがそのまま残さ場合、私はあなたの人々が私のコーディングスタイルについて他の教育の批判があるかもしれません、考え出し

#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 :] 

私が持っている問題は神秘的です。予想通り

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

このすべての作品:

string filename = argv[1]; 

、その後の拡張のためにそれを検索し、端から始まり、最初に自分の道を働い:私はそうのような文字列に渡される引数を置きますしかし、その後、私がファイル名を出力しようとすると、それは不思議な空ですか?私はcoutでデバッグを試みました。検索する前に文字列を印刷すると、正しく印刷されます。その後、何も印刷されません。これと同じように:

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

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

+1

私たちは実際には重要な要素だけを好みます。 http://sscce.org/ – chris

+0

コードをスキップし、ちょうど下の部分を読む:] –

答えて

3

あなたはelseた後、ここにファイル名と呼ばれる第二の変数を宣言している:

string filename = argv[1]; 

これは、時間によって範囲外になるあなたはここに来る:あなたが今、内容を印刷している

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

あなたが宣言した最初の変数のfilenameは、mainのすぐ下にあります。

+0

ああ、うわー。それは盲目的に単純だった、私が行方不明だったことを信じることができない。ありがとう! –

+1

@betaRepeating通常、コンパイラはこれについて警告します。プログラムが警告なしで構築されていることを常に確認し、できるだけ多くの警告を有効にします。例えばclangと私はgccがこの変数を直接指し、「警告:宣言はローカル変数をシャドウします」と言っているとします。-Wshadowまたは-Weverythingをオンにすると – bames53

関連する問題