传递字符时%x格式指令

时间:2017-06-23 11:00:06

标签: c

#include <stdio.h>
int main(int argc, char *argv[]) {
printf("argc = %d\n", argc);
printf("argv[1] = %s\n", argv[1]);
printf("*argv[2] = %x\n", *argv[2]);
}

./commandline 123 abc

有人可以向我解释第三个printf声明的内容吗?并解释代码行正在做什么 - 我无法理解。

谢谢。

编辑:对不起,我的问题不是很清楚 - 我知道这是一个格式指令,但我对实际输出结果感到困惑。您将指针传递给第一个字符的地址 - 那么程序如何从字符中打印十六进制值?

3 个答案:

答案 0 :(得分:2)

在第三个printf中,argv[2]指向程序名称后面的第二个命令行参数。在这种情况下,它是&#34; abc&#34;。

所以*argv[2]取消引用指针指向字符串中的第一个字符&#39; a&#39;。此语法与argv[2][0]相同。

%x格式说明符表示以十六进制格式打印其参数。它的论点是*argv[2],这是&#39; a&#39;。假设ASCII编码,该字符的ASCII值为97十进制或61十六进制。

所以第三个printf输出&#34; 61&#34;。

答案 1 :(得分:0)

%x输出无符号整数的十六进制表示。在这种情况下,argv[2]参数中的第一个字符。

所以,如果你传递一封信,那就是&#39;作为您的参数,打印输出应该是该字符的十六进制表示,例如&#34; 61&#34;如果是ASCII编码。而且因为你只打印第一个字符,你会看到相同的#34; 61&#34;即使您的命令行参数是&#34; abc&#34;。

,也会打印出来

链接到参考:http://en.cppreference.com/w/c/io/fprintf

答案 2 :(得分:-1)

argv是命令行参数的序列:

argv[0] == "./commandline" 
argv[1] == "123" 
argv[2] == "abc"

每个参数都是一个字符串(char的零终止数组)。

*argv[2]相当于argv[2][0] - 它的计算结果为argv[2]的第一个字符,即'a'(ASCII 97)。

表达式*argv[2]的类型是char - 因为printf是一个可变函数,表达式的类型是&#34;提升&#34;从charint

%x转换说明符采用unsigned int参数,并将输出格式化为十六进制整数;因此,将97的ASCII值视为unsigned int,输出为十六进制等效值 - 0x61