格式指定类型';字符*';但参数的类型为';char';[-Wformat]

格式指定类型';字符*';但参数的类型为';char';[-Wformat],c,command-line-arguments,C,Command Line Arguments,当从终端调用特定程序“format.c”时,我试图检查并输出给定的命令行参数。我得到以下错误,我不明白它告诉我什么。 错误: 格式指定类型“char*”,但 参数的类型为“char”[-Wformat] 以下是我迄今为止的代码: #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> int printArguments( int argc, ch

当从终端调用特定程序“format.c”时,我试图检查并输出给定的命令行参数。我得到以下错误,我不明白它告诉我什么。 错误: 格式指定类型“char*”,但 参数的类型为“char”[-Wformat] 以下是我迄今为止的代码:

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

int printArguments( int argc, char **argv )
{
    int i;
    printf( "Total number of arguments: %d", argc );
    for( i = 0; i <= argc; i++ ){
        printf( "argv[%d] = %s\n", i, *argv[i] );
    }
    return 0;
}

int main ( int argc, char **argv )
{
    if( argc != 3 ){
        puts( "You failed to enter the correct number of arguments." );
        printf( "You entered: \nargv[0] = %s\nargv[1] = %s\nargv[2] = %s\n",
               argv[0], argv[1], argv[2] );
        puts( "Argument format should be, \"./format (arg1 = int value)"
             "(arg2 = file name)\"\n" );
        return 0;
    }
    if( atoi(argv[1]) < 25 ){
        printf( "\nargv[1] = %d\nYou entered a value too small for the format\n",
        atoi(argv[1]) );
        return 0;
    }
    if( atoi(argv[1]) > 100 ){
        printf( "\nargv[1] = %d\nYou entered a value too large for the           format\n",
        atoi(argv[1]) );
        return 0;
    }

    printArguments( argc, **argv );

    return 0;
} /*end of main */
#包括
#包括
#包括
#包括
int printArguments(int argc,char**argv)
{
int i;
printf(“参数总数:%d”,argc);
对于(i=0;i 100){
printf(“\nargv[1]=%d\n您输入的值对于格式而言太大\n”,
atoi(argv[1]);
返回0;
}
打印参数(argc,**argv);
返回0;
}/*主管道末端*/
试试看

#包括
#包括
#包括
#包括
int printArguments(int argc,char**argv)
{
int i;
printf(“参数总数:%d”,argc);
对于(i=0;i 100){
printf(“\nargv[1]=%d\n您输入的值对于格式而言太大\n”,
atoi(argv[1]);
返回0;
}
打印参数(argc、argv);
返回0;
}/*主管道末端*/
更正如下:
printArguments(argc,argv)
printf(“argv[%d]=%s\n”,i,*(argv+i))

[已编辑]
printArguments
函数需要类型为
int
char**
的参数。这就是
argc
argv
已经存在的情况。如果键入
**argv
,则将指针解引用两次。因此,您正在执行char**=>char*=>char(这就是解引用所做的,“删除”一颗星)。 所以,函数期望指针指向一个字符,但它得到一个字符。错

其次,为了解释*argv[i]的错误,我们必须理解C程序员是如何存储数据的。首先,给C程序一些内存,这些内存分为四个部分:堆栈段、数据段、堆段和代码段。数据段存储全局变量,代码段存储程序代码。堆段存储动态分配的变量。它们没有自己的名字,一个根据内存中的地址检索数据。这是通过argv[i]即*(argv+i)完成的。这完全是一样的,只是另一种语法

因此,让我们概述一下某些数据结构是如何存储在内存中的: 1.
inta[5]
是一个由5个整数组成的数组。如果不是全局数组,则存储在堆栈上。使用此声明,内存中会占用20个字节。在这个数组中,我们最多可以保存5个整数或更少,但不能保存更多。 2.
int*p=NULL
是一个指针。它可以指向一个整数。有了这个初始化,它就没有任何意义了。当我们说变量“指向”某个地方时,我们的意思是它不包含确切的数据(数字、字符),而是包含该数据所在的地址。 3.
int*p=(int*)malloc(sizeof(int)*5)
是一个指向五个整数中第一个整数的变量,即它在五个整数数组的堆段中包含一个地址。所以,*p*(p+0)p[0]。您可以通过在数组中移动指针来可视化这一点。p有第一个的地址。我们使用一些“指针算法”检索其他指针

4.
inta[3][5]
是一个静态分配的二维数组。它是一个数组,元素也是数组。由于它不是动态分配的,所以它存储在堆栈或数据段上(取决于声明它的位置,在某个函数内部或外部)。 5.
int*a[5]
是指针数组。因此,首先是静态分配的数组(堆栈/数据段)。之后,我们可以动态分配成员数组(但它们将位于堆上)。 6.
int**a
是指向指针的指针。因此,
a
包含一个位置的地址,该位置也有一个存储整数的地址。所以,
a
指向一个也指向一个整数的地方。 在步骤b)之后,我们说它应该指向数组中五个整数中的第一个(当然是在堆中)。这个数组的成员是什么?我们说过
a
指向的东西也指向某个东西,所以成员也是指针。我们可以说这些指针现在指向哪里。这在步骤c)之后完成

最后,, 对于字符,我们的情况与整数相同。 7.类似于案例1(但您可以看到,我们为'\0'额外保存了一个字节) 8.类似于案例5 带有
char**
的案例与案例6类似

(*)的情况是你的
intargc
char**argv
的样子。 这些是
main()
函数的参数,因此存储在堆栈框架中
argv
是指向第一个也是指针的元素的指针,指向字符数组中的第一个字符[如果说
argv
是“字符数组”,这是错误的,如果我们有
char argv[50][50]
;如果说
argv
是一个指针数组,那将是
char*argv[50]
)。那么,
argv
是指向指向第一个字符的n个指针中的第一个的指针

所以,最后,
argv[i]*(argv+i)
[这就是我们检索第i个指针的方式] 这意味着
*argv[i]*(*(argv+i))
[这就是我们如何检索第i个指针指向的位置。它指向第i个参数的第一个字符!]

因此,
argv[i]
属于
char*
类型,
*argv[i]
属于
char
类型。您尝试使用
%s
打印参数,即
printf()
需要“字符串”,即“字符数组”,即字符序列中第一个字符的地址(这是C中数组实际存储的内容)而不仅仅是一个实际的字符


我希望这有帮助。

您应该将
argv[I]
而不是
*argv[I]
传递给

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

int printArguments( int argc, char **argv )
{
    int i;
    printf( "Total number of arguments: %d", argc );
    for( i = 0; i <= argc; i++ ){
        printf( "argv[%d] = %s\n", i, *(argv+i) );
    }
    return 0;
}

int main ( int argc, char **argv )
{
    if( argc != 3 ){
        puts( "You failed to enter the correct number of arguments." );
        printf( "You entered: \nargv[0] = %s\nargv[1] = %s\nargv[2] = %s\n",
               argv[0], argv[1], argv[2] );
        puts( "Argument format should be, \"./format (arg1 = int value)"
             "(arg2 = file name)\"\n" );
        return 0;
    }
    if( atoi(argv[1]) < 25 ){
        printf( "\nargv[1] = %d\nYou entered a value too small for the format\n",
        atoi(argv[1]) );
        return 0;
    }
    if( atoi(argv[1]) > 100 ){
        printf( "\nargv[1] = %d\nYou entered a value too large for the           format\n",
        atoi(argv[1]) );
        return 0;
    }

    printArguments( argc, argv );

    return 0;
} /*end of main */