在我是IRC成员的IRC频道上,一个特定的人会模仿我发布的每一段代码,即使这是一个粗略的草稿,或者我已经几个月没有编码了。我对计算机理论和知识相当精通,但由于很少实践,我的编程技能缺乏。这个特定的代码来自我正在启动的一个项目,当他指出这个特定的片段时,我正在GitHub上写下一些想法/结构。
因此,经过几个月的尝试重新开始编码的纪律,我编码了这个,我的问题是:如果像这样的缩进是不好的,我在这里做了什么错误,假设逻辑是合理的(我从来没有测试过它,我继续停顿)?另外,你会如何避免缩进?
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是一个静态声明的字符数组。
发布于 2013-01-14 17:20:07
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开始。
if(arguments[currentArg][0] == '-'){
for(paramIndex = 0; paramIndex < PARAMMAX; paramIndex++){
if(strcmp(arguments[currentArg][1], arglist[paramIndex]) == 0){arguments[currentArg][1]不是char吗?你是如何把它传递给strcmp的?
switch(paramIndex){
case 0:
//load(currentArg + 1);
currentArg++;我建议不要在循环中操作循环计数器。这使得跟踪发生了什么事情变得更加困难。
break;
default:
break;
}
break;
}
}
}
}
}大量缩进提示您应该将其分解为更小的函数。我还建议您将参数的结果存储到一个结构中。
关于我如何做到这一点的概略说明:
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);
}
}发布于 2013-01-14 18:27:16
解析C程序的参数是一个已经解决的问题。我知道你想再次弯曲你的C肌肉。我建议通过重用库来展示它们。
这将完成以下几项任务:
另请参阅:
发布于 2013-01-14 17:04:56
您的代码看起来非常合理,缩进是非常标准的。我看到的唯一问题是C数组是基于零的,所以循环
for(currentArg = 1; currentArg <= count; currentArg++){应该是
for(currentArg = 0; currentArg < count; currentArg++){如果您正在解析命令行并故意忽略arg0,那么在代码中添加注释是值得的。以及count是参数的总数(意味着循环退出条件应该是currentArg < count)还是这个函数中要解析的参数数(意味着currentArg <= count是一个有效的退出条件)
https://codereview.stackexchange.com/questions/20511
复制相似问题