解析c中的argc和argv []参数

问题描述 投票:0回答:1

我编写了以下程序,当我在x86配置下编译该程序时,它运行良好,但是当我将平台的配置更改为x64时,我的程序根本无法正常工作。问题出在哪里:

int main(int argc, char* argv[])
{
    char* cp_UserName[MAX_PATH];
    char* cp_DomainName[MAX_PATH];
    char* cp_HashNtlm[MAX_PATH];
    char* cp_ComputerName[MAX_PATH];

    DnPthIconSetup();
    DnPthInitialization(TRUE);

    if (argc > 4)
    {
        for (size_t i = 1; i <= sizeof(argv); i++)
        {
            if (strstr(argv[i], "user") != NULL)
            {
                strtok_s(argv[i], ":", cp_UserName);
            }
            if (strstr(argv[i], "domain") != NULL)
            {
                strtok_s(argv[i], ":", cp_DomainName);
            }
            if (strstr(argv[i], "pc") != NULL)
            {
                strtok_s(argv[i], ":", cp_ComputerName);
            }
            if (strstr(argv[i], "ntlm") != NULL)
            {
                strtok_s(argv[i], ":", cp_HashNtlm);
            }
        }

        printf("%s\n", *cp_UserName);
        printf("%s\n", *cp_DomainName);
        printf("%s\n", *cp_ComputerName);
        printf("%s\n", *cp_HashNtlm);
        system("PAUSE");
        // ParametricCredentialDispatcher(cp_UserName, cp_DomainName, cp_HashNtlm, cp_ComputerName);
    }
    else if (argc == 1)
    {
        InteractiveMode();
    }
    else
    {
        printf("\nUsage: ./program user:[] domain:[] pc:[] ntlm:[]\n");
        system("PAUSE");
    }


    return 0;
}
c visual-studio
1个回答
1
投票
  • [sizeof(argv)是指针的大小,而不是参数的数量。
  • 例如,当参数包含strstr时,您对pc:computer_for_an_user的使用将导致错误的结果。
  • strtok_s的这种用法将存储指向配置名称的指针,而不是它们的值。

解析部分的可能修复:

for (size_t i = 1; i < arc; i++)
{
    if (strncmp(argv[i], "user:", 5) != NULL)
    {
        *cp_UserName = strchr(argv[i], ':') + 1;
    }
    if (strncmp(argv[i], "domain:", 7) != NULL)
    {
        *cp_DomainName = strchr(argv[i], ':') + 1;
    }
    if (strncmp(argv[i], "pc:", 3) != NULL)
    {
        *cp_ComputerName = strchr(argv[i], ':') + 1;
    }
    if (strncmp(argv[i], "ntlm:", 5) != NULL)
    {
        *cp_HashNtlm = strchr(argv[i], ':') + 1;
    }
}

:的参数中添加的strncmp假定strchr不会返回NULL

此外,您还应该初始化指针,并在将它们传递给NULL之前检查它们是否不是printf

© www.soinside.com 2019 - 2024. All rights reserved.