【问题标题】:Checking if String is an int [duplicate]检查字符串是否为 int [重复]
【发布时间】:2018-09-28 04:42:27
【问题描述】:

我正在尝试输入格式

"prog1 1 所有文件1"

第一个输入必须是 argv[1] 应该是 int。

所以我需要一种方法来确定 argv[1] 是否作为字符串“xxx”(“prog1 xxx”)输入,它应该返回“NO PHRASE LENGTH”但它返回“INVALID PHRASE LENGTH”。

我看到有一个 isdigit() 函数,但我不确定如何使用它。

int main(int argc, char *argv[]){


try{
if(argc == 1){

   cout << "NO PHRASE LENGTH" << endl;  exit(1); 
}
else if((stoi(argv[1])) <= 0 ){ 

    cout << "INVALID PHRASE LENGTH" << endl;  exit(1); 
}
else if(argc == 2){

   cout << "NO MODE" << endl;  exit(1); 
}
else if(!(std::string(argv[2]) == "all") && !(std::string(argv[2]) == "top")){

    cout << "INVALID MODE" << endl;
}
else if(argc == 3){

    cout << "NO FILES GIVEN" << endl;
}
else if(argc >= 4){


    ifstream f;
    for(int i = 4; i < argc; i--){

        f.open( argv[i] );

        if( ! f.good() ) { 
            cout << "BAD FILE " << argv[i] << endl; exit(1); 
        }

        //cout << "OK" << endl;
        //f.close();

    }




}
else
    return 0;
}
catch(exception e){
}} 

【问题讨论】:

  • 根据您的 if 结构,“NO PHRASE LENGTH”仅在您调用没有命令行参数(“prog1”)的程序时才会写入。调用不带参数的程序会将argc 设置为 1,并且您提供的代码只会在这种情况下打印“NO PHRASE LENGTH”。
  • 仍然没有回答我的问题。 /// if(argc == 1){ cout

标签: c++


【解决方案1】:

您的代码非常混乱。我不确定你在用 for 循环做什么来打开文件。不管怎样,我已经举了一个例子。

int main(int argc, char *argv[])
{
    if(argc != 4)
    {
        cout << "Program requires 3 parameters!" << endl;
        return -1;
    }

    if(std::string(argv[2]) != "all" && std::string(argv[2]) != "top")
    {

        cout << "INVALID MODE" << endl;
        return -1;
    }

    try
    {
        if(stoi(argv[1]) < 1)
        {
            cout << "ZERO OR NEGATIVE PHRASE LENGTH" << endl;
            return -1;
        }

        ifstream f(argv[3]);
        if(!f) 
        { 
            cout << "BAD FILE " << argv[3] << endl;
            return -1; 
        }

        // Now do whatever you want with the opened file
    }
    catch(out_of_range e)
    {
        cout << "NON-INT PHRASE LENGTH" << endl; 
        return -1;
    }
    return 0;
} 

【讨论】:

    【解决方案2】:

    当你只想说'\n'(或"...\n")时,不要使用std::endlstd::endl 不仅在流中插入换行符,而且还刷新它。如果你*真的*想刷新一个流,请明确并使用std::flush

    如果有其他方法,请不要使用exit() 来结束程序。如果您使用exit(),则不会发生堆栈展开。

    #include <cstdlib>
    #include <string>
    #include <iostream>
    #include <exception>
    #include <fstream>
    
    int main(int argc, char **argv)
    {
        if (argc == 1) {
            std::cerr << "NO PHRASE LENGTH\n";
            return EXIT_FAILURE;
        }
    
        if (argc == 2) {
            std::cerr << "NO MODE\n";
            return EXIT_FAILURE;
        }
    
        if (argc == 3) {
            std::cerr << "NO FILES GIVEN\n";
            return EXIT_FAILURE;
        }
    
        int phrase_length;
        try {
            phrase_length = std::stoi(argv[1]);
            if (phrase_length < 0)
                throw std::out_of_range{ nullptr };
        }
        catch (std::invalid_argument) {
            std::cerr << "NO PHRASE LENGTH";
            return EXIT_FAILURE;
        }
        catch (std::out_of_range) {
            std::cerr << "PHRASE LENGTH OUT OF RANGE\n";
            return EXIT_FAILURE;
        }
    
        std::string mode{ argv[2] };
    
        if ( mode != "all" && mode != "top") {
            std::cerr << "INVALID MODE\n";
            return EXIT_FAILURE;
        }
    
        for (int i = 3; i < argc; ++i) {
            std::fstream input_file{ argv[i] };
            if (!input_file.is_open()) {
                std::cerr << "BAD FILE \"" << argv[i] << "\"\n";
                return EXIT_FAILURE;
            }
        }
    }
    

    【讨论】:

    • 你能解释一下最后的for循环,它是做什么的吗?
    • for 循环允许您处理多个文件。您可以使用文件列表(“prog1 1 all file1 file2 file3”)调用程序,它将处理所有文件。
    猜你喜欢
    • 2014-04-30
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2014-07-06
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多