代码之家  ›  专栏  ›  技术社区  ›  KingKenny04

C++:“char*”vs“char”,尝试分配变量时出错

  •  -1
  • KingKenny04  · 技术社区  · 7 年前

    我正在为编程I课做作业。我是C++的新手。我们要做的是获取用户在执行时提供的年、月和日参数,并计算它们与当前日期之间的差值。

    在我的主函数中,我有以下代码从用户那里获取这些参数:

    int main(int argc, char** argv)
    

    我的理解是,这将创建一个字符数组并在其中存储用户的参数。接下来,我将存储在此数组中的参数分配给新的char变量,以便将它们传递给函数,如下所示:

    int main(int argc, char** argv)
    {
        int year, month, day;
        char arg1 = argv[1];
        string arg2 = argv[2];
        char arg3 = argv[3];
    
        argumentChange(argc, arg1, arg2, arg3, year, month, day);
    
    blablabla other code
    }
    

    哪里 argumentChange 是我将它们发送到的函数。问题是,当我尝试编译此文件时,我收到以下错误:

    错误:从“char*”到“char”[-fpermissive]的转换无效

    字符arg1=argv[1];

    错误:从“char*”到“char”[-fpermissive]的转换无效

    charArg3=argv[3];

    我已经试着寻找这个问题,但我真的无法理解其他地方给出的解释。我看到很多人提到了“指针”,这是我们在课堂上还没有讨论过的,我对此一无所知。我做错了什么?我该怎么做?

    以下是我整个程序的完整代码:

    #include <iostream>
    #include <ctime>
    #include <string>
    
    using namespace std;
    
    void argumentChange(int numArg, char chArg1, string sArg2, char chArg3, int year, int month, int day)
    {
        cout << "Starting birth date: " << chArg1 << " " << sArg2 << " " << chArg3
             << endl;
        if (numArg < 4 || numArg > 4)
        {
            cout << "Correct Usage: ./cl <birth_year><birth_month><birth_day>" << endl;
            cout << "Try again, dude." << endl;
        }
        else if (numArg == 4)
        {
            year = chArg1 - '0';
            day = chArg3 - '0';
            if ((sArg2 == "january") || (sArg2 == "January"))
            {
            month = 0;
            }
            else if ((sArg2 == "february") || (sArg2 == "February"))
            {
                month = 1;
            }
            else if ((sArg2 == "march") || (sArg2 == "March"))
            {
                month = 2;
            }
            else if ((sArg2 == "april") || (sArg2 == "April"))
            {
                month = 3;
            }
            else if ((sArg2 == "may") || (sArg2 == "May"))
            {
                month = 4;
            }
            else if ((sArg2 == "june") || (sArg2 == "June"))
            {
                month = 5;
            }
            else if ((sArg2 == "july") || (sArg2 == "July"))
            {
                month = 6;
            }
            else if ((sArg2 == "august") || (sArg2 == "August"))
            {
                month = 7;
            }
            else if ((sArg2 == "september") || (sArg2 == "September"))
            {
                month = 8;
            }
            else if ((sArg2 == "october") || (sArg2 == "October"))
            {
                month = 9;
            }
            else if ((sArg2 == "november") || (sArg2 == "November"))
            {
                month = 10;
            }
            else if ((sArg2 == "december") || (sArg2 == "December"))
            {
                month = 11;
            }
            else
            {
                    cout << "Error: You have entered an invalid term for month.  Please type ";
                    cout << "the complete name of a valid month." << endl;
            }
        }
    }
    
    struct tm bday(int year, int month, int day)
        {
            struct tm r {0};
        
            r.tm_year = year - 1900;
            r.tm_mon = month;
            r.tm_mday = day;
        
            return r;
        }
    
    int main(int argc, char** argv)
    {
        int year, month, day;
        char arg1 = argv[1];
        string arg2 = argv[2];
        char arg3 = argv[3];
    
        argumentChange(argc, arg1, arg2, arg3, year, month, day);
    
        struct tm a = bday(year, month, day);
        time_t x = mktime(&a);
        time_t y = time(0);
        if ( x != (time_t)(-1) && y != (time_t)(-1) )
        {
            double difference = difftime(y, x) / (60 * 60 * 24);
            cout << ctime(&x);
            cout << ctime(&y);
            cout << "difference = " << difference << " days" << endl;
        }
        return 0;
    }
    
    2 回复  |  直到 4 年前
        1
  •  1
  •   dempzorz    7 年前

    如前所述,argv[x]的类型是 char* ,它是指向字符数组的指针。所以 char** 是指向数组数组的指针。(实际上*并不自动意味着它是指向数组的指针,只是在这种情况下)

    //  argv is an array of char*'s
    int main(int argc, char** argv)
    
    // firstParam is an array of char's 
    char* firstParam = argv[1];
    
    // firstLetter is the first char of the array
    char firstLetter = firstParam[0]
    

    真的,你应该跳过所有 char 数组并仅使用 std::string s.eg

    int main(int argc, char** argv) {
        std::string param = argv[1];
    
        if (param == "january") {
            // Something ...
        }
    
    }
    

    您还应该检查传入的参数数量,这样就不会访问数组范围之外的参数。就是这样 argc 用于。

        2
  •  0
  •   Chen OT    7 年前

    在类型中存储一组变量时 T ,我们可能有 dynamic array 存储它。通常我们使用指向数组的指针,其类型为 T*

    对于 int 例如:

    int* ary1 = new int[3];
    ary1[0] = 10; // ary1 + 0 store 10, a int
    ary1[1] = 11; // ary1 + 1 store 11, a int 
    ary1[2] = 12; // ary1 + 2 store i2, a int
    

    与相同 char* 一串

    char** argv= new char*[4];
    argv[0] = "cl.exe" // ary2 + 0 stores "cl.exe", a `char*` string
    argv[1] = "2018""  // ary2 + 1 stores "2018"  , a `char*` string
    argv[2] = "3"      // ary2 + 2 stores "3"     , a `char*` string
    argv[3] = "16"     // ary2 + 3 stores "16"    , a `char*` string
    

    这就是为什么您不能分配 argv[1] ,(a char字符* 字符串),至 arg1 ,(a char 字符)。