c-为什么一个seg断层而另一个没有



嗨,我有一个程序需要将字符串数组与预定义字符串进行比较,但当我使用变量args[0]时,它在我的函数strcmp中工作,如下所示

int gash_execute(char **args){
    int i;
    if(args[0] == NULL){
        return 1;
    }
    for(i = 0; i < gash_command_num(); i++){
        if(strcmp(args[0], functions[i]) == 0){
            return(*function_address[i])(args);     
        } 
    }
    return gash_launch(args);
}

然而,当尝试strcmp args[i]时,如下面所示,我会遇到seg错误。有人能帮我找到解决这个问题的办法吗?

int gash_execute(char **args){
    int i;
    if(args[0] == NULL){
        return 1;
    }
    for(i = 0; i < gash_command_num(); i++){
        if(strcmp(args[i], functions[i]) == 0){
            return(*function_address[i])(args);     
        } 
    }
    return gash_launch(args);
}

args[]是一个以前用空格分隔的字符串数组,这个程序用于自定义shell,所以假设我在shell命令行中输入的"cat echo ls"args[0]将是"cat"等等。但是现在我需要实现I/o重定向。因此,我需要检查args的每个元素,以检查它们是否代表符号"<">"|",如果其中一个是,我们可以从那里获取

如果没有看到所有的代码,或者没有看到valgrind等工具的报告,我不能肯定。但我可以告诉你,这个循环充满了潜在的问题。

for(i = 0; i < gash_command_num(); i++){
    if(strcmp(args[i], functions[i]) == 0){
        return(*function_address[i])(args);     
    } 
}

它基于某个函数调用迭代三个数组(argsfunctionsfunction_address),该函数调用不将这些数组作为变量(gash_command_num()),而这些变量与这些数组中实际有多少元素有未知关系。

它使用了两个全局变量(functionsfunction_addresses),它们可以包含任何内容。

如果所有这些事情都是相关的,我建议明确。。。但我怀疑他们不是。我怀疑你的循环逻辑是错误的。比较args[i]functions[i]。我怀疑gash_command_num()实际上是functions的大小,所以循环正在离开args

我怀疑您真正想做的是查看args[0]是否与functions中的任何函数名匹配,然后调用相关函数。如果args[0]ls,那么您需要检查ls是否有一个内置的shell函数,并使用所有参数调用它。

与其一遍又一遍地搜索一个列表,并且必须管理两个平行的列表,不如使用哈希表。键是函数名称,值是函数指针。C没有内置哈希表,但有很多库可以实现这一点。Gnome-Lib是一个很好的选择,可以满足C所缺少的这一点和许多其他基本功能。

使用哈希表,并消除全局变量,您的代码简化为:

/* For encapsulation */
typedef int(*shell_function_t)(char **);
int gash_execute(char **args, GHashTable *shell_functions){
    int i;
    if(args[0] == NULL){
        return 1;
    }
    shell_function_t func = g_hash_table_lookup(shell_functions, args[0]);
    if( func ) {
        return(*func)(args);
    }
    else {
        return gash_launch(args);
    }
}

扫描管道现在是一个单独的问题。为此,确实希望在args中循环查找特殊字符。如果在创建args时,确保它以一个空指针结束,那么这就简单多了。

for(int i = 0; args[i] != NULL; i++) {
    ...check if args[i] is special...
}

相关内容

  • 没有找到相关文章

最新更新