我试图检查并输出从终端调用特定程序"format.c"时给出的命令行参数.我收到以下错误,我不明白它告诉我的是什么.error:format指定类型'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 */
Run Code Online (Sandbox Code Playgroud)
尝试
#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 */
Run Code Online (Sandbox Code Playgroud)
更正是:
printArguments( argc, argv );
和
printf( "argv[%d] = %s\n", i, *(argv+i) );
[EDITED]
printArguments函数需要类型int和的参数char **.这就是现在argc和argv已经存在的.如果键入**argv,则两次取消引用指针.所以,你正在做char**=> char*=> char(这是dereferencing所做的,"删除"一个星).因此,函数需要指向指向char的指针,但它会获得一个char.错误.
其次,要解释*argv [i]的错误,必须要了解C程序员如何存储其数据.首先,给C程序一些内部存储器,它分为四个部分:堆栈段,数据段,堆段和代码段.数据段存储全局变量,代码段存储程序的代码.堆段存储动态分配的变量.它们没有自己的名字,而是通过内存中的地址检索数据.这是用argv [i] ie*(argv + i)完成的.这是完全相同的事情,只是另一种语法.
那么,让我们概述一下如何将某些数据结构存储在内存中:
1. int a[5]是一个由5个整数组成的数组.如果不是全局数组,则将其存储在堆栈中.使用此声明,内存中占用20个字节.我们可以在此阵列中保存最多5个整数,但不能更多.2. int *p = NULL是一个指针.它可以指向一个整数.通过这种初始化,它无处可寻.当我们在某处说变量"指向"时,我们的意思是它不包含精确数据(数字,字符),而是包含此数据的地址.3. int *p = (int *) malloc (sizeof(int) * 5)是指向五个整数中的第一个的变量,即它包含五个整数数组的堆段中的地址.所以,*p <=>*(p + 0)<=> p [0].您可以通过在数组内移动指针来可视化.所以,p具有第一个的地址.我们使用一些"指针算术"检索其他人.
4. int a[3][5]是静态分配的二维数组.它是一个数组元素也是数组.由于它不是动态分配的,因此它存储在堆栈或数据段上(取决于它在某个函数的内部或外部声明的位置).5. int *a[5]是一个指针数组.因此,首先有一个静态分配的数组(堆栈/数据段).之后,我们可以动态分配成员数组(但它们将在堆上).6. int **a是指针的指针.因此,a包含一个地址的地址,该地址也有一个存储某个整数的地址.因此,a指向一个也指向具有整数的位置的地方.在步骤b)之后,我们说它应该指向数组中的五个整数中的第一个(当然,在堆中).这个阵列的成员是什么?我们说过a指向某些东西的东西,所以成员也是指针.我们可以说这些指针现在指向哪里.这是在步骤c)之后完成的.
最后,
与字符我们有相同的情况与整数.7.就像情况1(但是你可以看到我们为'\ 0'节省了一个额外的字节)8.就像情况5情况char **就像情况6一样.
和(*)的情况是怎么样的int argc,并char **argv样子.这些是函数的参数main(),因此存储在堆栈框架中.argv是指针指向第一个也是指针的元素的指针,指向字符数组中的第一个字符[如果说argv'是字符数组' 那就错了,如果我们有的话就是这样char argv[50][50]; 说这argv是一个指针数组是错误的char *argv[50].因此,argv指针指向指向第一个字符的n个指针中的第一个.
所以,最后,argv[i] <=> *(argv+i) [这是我们检索ith指针的方式]这意味着*argv[i] <=> *(*(argv+i))[这就是我们检索第i个指针指向的位置.它指向第i个参数的第一个字符!]
所以,argv[i]是类型char *,并且*argv[i]是类型char.你试图打印参数,%s即printf()期望"字符串"即"字符数组",即字符序列中第一个字符的地址(这是C实际存储的数组),而不仅仅是一个实际的字符.
我希望这有帮助.:)