【问题标题】:c programming print ascii value of char*c编程打印char的ascii值*
【发布时间】:2015-06-24 16:02:02
【问题描述】:

我正在尝试将char* 例如A 的ascii 值(ascii int 数字)打印为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 *”

【问题讨论】:

  • 如果argv[i] 有效,(int) *argv[i] 应该可以正常工作(argvchar * 的数组,所以*argv[i] 取消引用argv[i] 处的指针,有效地转换第一个char 转换为 int(在 C 中是合法的)。char 始终小于 int,因此可以提升为 int

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


【解决方案1】:
    printf("i is %d argv[i] %d\n", i, argv[i]);

是导致线路的问题。在 C 中使用不正确的格式说明符是 undefined behaviour

argvchar** 类型,但 %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 chars。

移动这些 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]);

在参数检查下方,以便您仅在 参数检查之后打印它们。否则,如果传递的参数较少,您最终可能会访问不存在的参数。

【讨论】:

    【解决方案2】:
    • 第 1 点:在检查 argc &gt; n 之前不要直接使用 argv[n]。这还包括未经检查的循环,如

      for(i = 1; i < 100; i++)
      

      i 等于argc 之后,您最终将访问无效内存。

    • 第 2 点: argv[n] 默认是一个以 null 结尾的数组或 字符串(适用于有效情况)。你需要%s 格式说明符才能打印出来。

      也就是说,命令行A作为a.out的第一个参数在程序内部表示为"A"作为argv[1]。它不再是char,而是一个字符串

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 2016-03-02
      相关资源
      最近更新 更多