【问题标题】:String turns up empty after find_last_of() and substr()?字符串在 find_last_of() 和 substr() 之后变为空?
【发布时间】:2012-04-26 21:30:59
【问题描述】:

自学 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() 重置它,但这没有任何作用。有人能解释一下这个令人费解的问题吗?

【问题讨论】:

  • 我们实际上只喜欢关键元素。 sscce.org
  • 然后跳过代码,只阅读底部部分:]

标签: c++


【解决方案1】:

您在else 之后在这里声明了第二个名为filename 的变量:

string filename = argv[1];

当你到达这里时,这已经超出了范围:

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

您现在正在打印您声明的第一个变量filename 的内容,就在main 下方。

【讨论】:

  • 啊,哇。这简直太简单了,简直不敢相信那是我所缺少的。谢谢!
  • @betaRepeating 通常编译器对此有警告。始终确保您的程序在没有警告的情况下构建,并尽可能多地启用警告。例如clang,我假设gcc会直接指向这个变量,如果你打开-Wshadow或-Weverything,会说'警告:声明会影响局部变量'
猜你喜欢
  • 1970-01-01
  • 2023-02-24
  • 2015-03-22
  • 1970-01-01
  • 2018-04-30
  • 2019-10-13
  • 2022-01-21
  • 1970-01-01
  • 2012-02-08
相关资源
最近更新 更多