我试图打印char*
的ascii值(ascii int数字),例如A
,为ascii table上的65。
这是我的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int i = 0;
printf(" Hello World \n");
printf("argv[0] is %s! \n",argv[0]);
printf("argv[1] is %s! \n",argv[1]);
printf("argv[2] is %s! \n",argv[2]);
printf("argv[3] is %s! \n",argv[3]);
if( argc == 4 )
{
printf("The first argument supplied is %s\n", argv[1]);
printf("The second argument supplied is %s\n", argv[2]);
printf("The third argument supplied is %s\n", argv[3]);
}
else if( argc > 4 )
{
printf("Too many arguments supplied.\n");
exit( 1 );
}
else
{
printf("Not enough arguments supplied. \n");
exit( 1 );
}
for(i = 1; i < 100; i++)
{
printf("i is %d argv[i] %d\n", i, argv[i]);
}
return(0);
}
我希望从命令中输入这些值,这就是我放入的内容。
./a.out A B C
当我编译它时,我收到此警告。
警告:格式'%d'需要类型'int',但参数3的类型为'char *'
如果我将argv[i]
转换为(int)
,我会收到此消息。
警告:从指针强制转换为不同大小的整数
如果我将argv[i]
转换为(int *)
,我会收到此消息。
警告:格式'%d'需要类型'int',但参数3的类型为'int *'
答案 0 :(得分:2)
printf("i is %d argv[i] %d\n", i, argv[i]);
是造成问题的问题。在C中使用不正确的格式说明符是undefined behaviour。
argv
的类型为char**
,但%d
格式说明符需要int
。因此,要打印参数的ascii值,您需要在argv
之上嵌套循环。
for(j=1;j<argc; j++) {
for(i=0;argv[j][i];i++) {
printf("i is %d argv[i] %d\n", j, argv[j][i]);
}
}
请注意,您的循环条件不正确。每个参数只有strlen(argv[j])
个字符。因此,您无法随意打印100
字符。
移动这些printf语句
printf("argv[0] is %s! \n",argv[0]);
printf("argv[1] is %s! \n",argv[1]);
printf("argv[2] is %s! \n",argv[2]);
printf("argv[3] is %s! \n",argv[3]);
在参数检查下方,以便在参数检查后只打印。否则,如果传递的参数较少,您最终可能会访问不存在的参数。
答案 1 :(得分:0)
第1点:在您检查argv[n]
之前,请不要直接使用argc > n
。这还包括未经检查的循环,如
for(i = 1; i < 100; i++)
在i
等于argc
后,您将最终访问无效内存。
第2点: argv[n]
默认为空终止数组或字符串(对于有效情况)。您需要%s
格式说明符才能打印出来。
也就是说,作为A
的第一个参数的命令行a.out
在程序内表示为"A"
为argv[1]
。它不再是char
,而是字符串。