首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C参数解析方法批评

C参数解析方法批评
EN

Code Review用户
提问于 2013-01-14 16:47:03
回答 3查看 226关注 0票数 4

在我是IRC成员的IRC频道上,一个特定的人会模仿我发布的每一段代码,即使这是一个粗略的草稿,或者我已经几个月没有编码了。我对计算机理论和知识相当精通,但由于很少实践,我的编程技能缺乏。这个特定的代码来自我正在启动的一个项目,当他指出这个特定的片段时,我正在GitHub上写下一些想法/结构。

因此,经过几个月的尝试重新开始编码的纪律,我编码了这个,我的问题是:如果像这样的缩进是不好的,我在这里做了什么错误,假设逻辑是合理的(我从来没有测试过它,我继续停顿)?另外,你会如何避免缩进?

代码语言:javascript
复制
void parse_arguments(int count, char * arguments[]){//probably add file pointer here  to pass to load, change return type when an API is decided.
    int currentArg, paramIndex;

    for(currentArg = 1; currentArg <= count; currentArg++){
        if(arguments[currentArg][0] == '-'){
            for(paramIndex = 0; paramIndex < PARAMMAX; paramIndex++){
                if(strcmp(arguments[currentArg][1], arglist[paramIndex]) == 0){
                    switch(paramIndex){
                        case 0:
                            //load(currentArg + 1);
                            currentArg++;
                            break;
                        default:
                            break;
                    }
                    break;
                }
            }
        }
    }
}

注意:arglist是一个静态声明的字符数组。

EN

回答 3

Code Review用户

回答已采纳

发布于 2013-01-14 17:20:07

代码语言:javascript
复制
void parse_arguments(int count, char * arguments[]){//probably add file pointer here  to pass to load, change return type when an API is decided.
    int currentArg, paramIndex;

    for(currentArg = 1; currentArg <= count; currentArg++){

你为什么从零开始数?在C数组中,从零开始,但从1开始。

代码语言:javascript
复制
        if(arguments[currentArg][0] == '-'){
            for(paramIndex = 0; paramIndex < PARAMMAX; paramIndex++){
                if(strcmp(arguments[currentArg][1], arglist[paramIndex]) == 0){

arguments[currentArg][1]不是char吗?你是如何把它传递给strcmp的?

代码语言:javascript
复制
                    switch(paramIndex){
                        case 0:
                            //load(currentArg + 1);
                            currentArg++;

我建议不要在循环中操作循环计数器。这使得跟踪发生了什么事情变得更加困难。

代码语言:javascript
复制
                            break;
                        default:
                            break;
                    }
                    break;
                }
            }
        }
    }
}

大量缩进提示您应该将其分解为更小的函数。我还建议您将参数的结果存储到一个结构中。

关于我如何做到这一点的概略说明:

代码语言:javascript
复制
struct options
{
    char * filename;
    int numberOfRabbits;
};

struct parameter
{
    char * name; // 'x' for option '-x'
    bool requiresOption; // whether or not we should have an option
    void (*handler)(struct options * options, char * argument);
};

void parse_arguments(int count, char * arguments[], struct options * options)
{
    char * argument;
    int position = 0;
    while(position < count)
    {
         struct parameter * param = determine_parameter(arguments[position++]);
         if(!parameter)
         {
              panic(); // don't know this parameter
         }
         if(param.requiresOption)
         {
               argument = arguments[position++];
         }else{
               argument = NULL;
         }
         param.handler(options, argument);
    }
}
票数 5
EN

Code Review用户

发布于 2013-01-14 18:27:16

解析C程序的参数是一个已经解决的问题。我知道你想再次弯曲你的C肌肉。我建议通过重用库来展示它们。

这将完成以下几项任务:

  • 减少代码中的bug数量。
  • 利用一种更灵活的方法来解析参数。
  • 给你更多的时间做更有趣的部分你的程序。
  • 让您练习将外部库集成到代码中。
  • 删除箭头代码。

另请参阅:

票数 2
EN

Code Review用户

发布于 2013-01-14 17:04:56

您的代码看起来非常合理,缩进是非常标准的。我看到的唯一问题是C数组是基于零的,所以循环

代码语言:javascript
复制
for(currentArg = 1; currentArg <= count; currentArg++){

应该是

代码语言:javascript
复制
for(currentArg = 0; currentArg < count; currentArg++){

如果您正在解析命令行并故意忽略arg0,那么在代码中添加注释是值得的。以及count是参数的总数(意味着循环退出条件应该是currentArg < count)还是这个函数中要解析的参数数(意味着currentArg <= count是一个有效的退出条件)

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/20511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档