C:通过指针访问第二个 argv

C: Accessing the second argv via a pointer

由于我是 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]);

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

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]
}}

在索引指针数组之前,我们必须确保它是有效的。为此,我们必须使用 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] != '[=10=]' && *err != '[=10=]';
    }
    return 0;
}

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

现在,要回答您的问题,您不需要将 argv 整个传递给函数 "check"。您需要做的是传递 argvs 元素之一。这是因为 "check" 的参数是一个 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 != '[=10=]') {
        if (!isdigit(c))
            return 0;
        c = p[++i];
    }
    return 1;
}