c编程打印char的ascii值*

时间:2015-06-24 07:32:27

标签: c pointers char compiler-warnings command-line-parsing

我试图打印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 *'

2 个答案:

答案 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,而是字符串