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

C:通过指针访问第二个argv,c,pointers,int,argv,dereference,C,Pointers,Int,Argv,Dereference,由于我是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(在打印解

由于我是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 check(char* p){
当您传递
argv
时,上面的函数需要一个指向
char
的指针,它是
char*
试一试

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

int main(int argc, char* argv[]){
if(argc>1 && check(argv)){
    // Do stuff to argv[1]
}}
当您传递
argv
时,上面的函数需要一个指向
char
的指针,它是
char*
试一试

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

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

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

是一个函数,它解析字符串并检测错误(如果它不是基函数)

这是:

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

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

是一个函数,它解析字符串并检测错误(如果它不是基函数)

这是:

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是一个二维数组,也就是说Argv是一个数组数组。具体来说,argv是字符数组的数组。现在,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 != '\0') {
        if (!isdigit(c))
            return 0;
        c = p[++i];
    }
    return 1;
}
#包括
#包括
int main(int argc,char*argv[]){
对于(int i=1;i
Argv是一个二维数组,也就是说Argv是一个数组数组。具体地说,Argv是一个字符数组数组。现在,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 != '\0') {
        if (!isdigit(c))
            return 0;
        c = p[++i];
    }
    return 1;
}
#包括
#包括
int main(int argc,char*argv[]){
对于(int i=1;i
argc应在索引argvchange“int-check(char*p)”到“int-check(char*p[])或“int-check(char**p)”之前使用“当前代码无效。编译器告诉过你。用当前版本作为起点来尝试它是没有意义的。@AnT想问一个关于工作代码的问题。嗯。这是个好主意,不是吗!不,编译器没有告诉我关于我的各种实验的任何信息。有些实验没有警告就通过了。”nd不会执行。@Felix:我不知道你说的“工作”是什么意思。你试图用
argv
参数调用
check
通常会从编译器中产生一条诊断消息,要么是关于参数类型不匹配(如果
check
有原型),要么是关于声明定义不匹配(否则)。这些诊断消息确切地告诉您:代码无效。这是必须首先解决的问题。在索引argvchange“int check(char*p)”到“int check(char*p[])或“int check(char**p)”之前,应使用argc“当前代码无效。编译器告诉过你。用当前版本作为起点来尝试它是没有意义的。@AnT想问一个关于工作代码的问题。嗯。这是个好主意,不是吗!不,编译器没有告诉我关于我的各种实验的任何信息。有些实验没有警告就通过了。”nd不会执行。@Felix:我不知道你说的“工作”是什么意思。你试图用
argv
参数调用
check
通常会从编译器中产生一条诊断消息,要么是关于参数类型不匹配(如果
check
有原型),要么是关于声明定义不匹配(否则)。这些诊断消息准确地告诉您:代码无效。这是必须首先解决的问题。注意:
argv[]中的最后一个指针
array保证为
NULL
,因此您不必严格地先检查
argc
。您是否有一个好的、规范的源代码,或者它是一种用法、一种惯例?我自己没有源代码,但这里有很多其他答案,因此可以断言标准确实需要此。注意:
argv[]中的最后一个指针
array保证为
NULL
,因此您不必严格地先检查
argc
。您是否有一个好的、规范的源代码,或者它是一种用法,或者