【问题标题】:C: Accessing the second argv via a pointerC: 通过指针访问第二个 argv
【发布时间】:2017-06-27 20:02:24
【问题描述】:

由于我对 C 很陌生,所以我还没有了解指针。我想检查命令行参数是否为整数,但在单独的函数中,以便我传入 argv 数组的指针。

int main(int argc, char* argv[]){
    if(check(argv)){
        // Do stuff to argv[1]
    }
}

int check(char* p){
    // Test wether p+1 is int
    return 1;
}

我已经尝试了几件事,主要是导致奇怪的 printf(在打印取消引用的指针以测试值时)。

int i = atoi(argv[1]);

当然工作得很好。但是由于指针是唯一传递给函数的东西,所以我瘫痪了。

【问题讨论】:

  • argc 应该在索引 argv 之前使用
  • 将 'int check(char *p)' 更改为 'int check (char *p[])' 或 'int check (char **p)'
  • 当前代码无效。编译器告诉你了。尝试以当前版本为起点尝试它是没有意义的。
  • @AnT 询问关于一段工作代码的问题。唔。现在这是一个绝妙的主意,init!不,编译器没有告诉我我的各种实验。有些通过时没有警告并且不会执行。
  • @Felix:我不确定你所说的“工作”是什么意思。您尝试使用argv 参数调用check 通常会从编译器产生诊断消息,关于参数类型不匹配(如果check 有原型)或关于声明定义不匹配(否则)。这些诊断消息准确地告诉您:代码无效。这是必须首先解决的问题。

标签: c pointers int argv dereference


【解决方案1】:

argv是一个二维数组,也就是说argv是一个数组数组。具体来说, argv 是一个 char 数组。现在,argv 存储的数据是从命令行传递给程序的参数,其中 argv[0] 是程序的实际名称,其余的是参数。

现在,要回答您的问题,您无需将 argv 全部传递给函数“check”。您需要做的是传递 argvs 元素之一。这是因为“检查”的参数是一个 char 数组,而 argv 是一个 char 数组的数组。所以尝试传递 argv[1] 来检查第一个参数。

编辑:试试这个检查除程序名称之外的所有参数

#include <stdio.h>
#include <ctype.h>

int main(int argc, char* argv[]) {
    for (int i = 1; i < argc; ++i) {
        if( check(argv[i]) ){
            // Do stuff to argv[i]
        }
}

int check(char* p){
    int i = 0;
    char c = p[i];
    while (c != '\0') {
        if (!isdigit(c))
            return 0;
        c = p[++i];
    }
    return 1;
}

【讨论】:

  • 为了确保:对于 int check(char ** p),p[1] 将是指向第二个 argv 的指针?
  • @Felix 是的,但前提是实际传递了足够多的参数
  • @Alnitak 是的,这不是问题。非常感谢!
【解决方案2】:
int check(char* p){

当您传递argv 时,上述函数需要一个指向char 的指针,它是char * 的数组 试试看

int check(char* p[]){

同样在使用argv[1]之前检查argv[1]是否存在,即检查argc

int main(int argc, char* argv[]){
if(argc>1 && check(argv)){
    // Do stuff to argv[1]
}}

【讨论】:

    【解决方案3】:

    在索引指针数组之前,我们必须确保它是有效的。为此,我们必须使用argc

    strtol 是一个函数,它解析一个字符串并在它不是所要求的基础时检测错误。

    写这个:

    int main(int argc, char* argv[]){
        if(check(argc, argv)){
            // Do stuff to argv[1]
        }
    }
    
    int check( int argc, char * argv[] ){
        if( argc > 1 ) {
           char * err = NULL;
           strtol( argv[1], &err, 10 );
           return argv[1][0] != '\0' && *err != '\0';
        }
        return 0;
    }
    

    【讨论】:

    • 注意:argv[] 数组中的最终指针保证为NULL,因此您不必严格首先检查argc。跨度>
    • 你有一个好的规范来源,或者它是一种用法,一种惯例?
    • 我自己没有消息来源,但这里有很多关于 SO 的其他答案断言标准确实需要这个。
    猜你喜欢
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多