格式指定类型';字符*';但参数的类型为';char';[-Wformat]
当从终端调用特定程序“format.c”时,我试图检查并输出给定的命令行参数。我得到以下错误,我不明白它告诉我什么。 错误: 格式指定类型“char*”,但 参数的类型为“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
#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 */