Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么字符串中的十六进制在通过命令行参数时不转换为十六进制?_C_String_Hex_Argv - Fatal编程技术网

C 为什么字符串中的十六进制在通过命令行参数时不转换为十六进制?

C 为什么字符串中的十六进制在通过命令行参数时不转换为十六进制?,c,string,hex,argv,C,String,Hex,Argv,据我所知,可以使用\x将十六进制数字放入字符串中。例如,0x41 0x42可以作为“\x41\x42”放置在字符串中 \x被丢弃,41被编译器视为十六进制 但如果我通过命令行参数将其传递给我的程序,它将不起作用 // test.c main( int argc , char * argv[] ) { printf( "%s\n" , argv[1] ) ; } $gcc-o prog test.c $./prog“\x41\x42” \x41\x

据我所知,可以使用
\x
将十六进制数字放入字符串中。例如,
0x41 0x42
可以作为
“\x41\x42”
放置在字符串中

\x
被丢弃,
41
被编译器视为十六进制

但如果我通过命令行参数将其传递给我的程序,它将不起作用

    // test.c
    main( int argc , char * argv[] ) 
    {
       printf( "%s\n" , argv[1] ) ;
    }
$gcc-o prog test.c
$./prog“\x41\x42”
\x41\x42
$.prog\x41\x42
\x41\x42

我所期望的是
AB
如示例1所示
为什么会这样?为什么这种表示方法在命令行参数的情况下不起作用?
我们确信是十六进制字符串的
argv[1]
中的值如何可以转换为十六进制数(无需解析,如第一个示例中所做的)


谢谢您的时间。

它在源代码中可以工作,因为编译器(预处理器)进行替换。 当您的程序在黑暗中单独工作时,没有编译器来帮助您完成这种替换


因此,如果您需要像编译器那样解析该字符串,请自己动手。

这不起作用,因为编译器在第二种情况下不存在,无法分析字符串。i、 e.这仅适用于代码中的字符串文字。

使用\x方法时,编译器在生成字符串文字时进行实际转换。当您通过命令行传入时,不会发生这种转换,因为编译器不参与


您需要编写一些代码来进行转换。

\x41是值为41(十六进制)的字节的内部C表示形式。当您编译这个程序时,它将是41h(只有1个字节-不是\x41)。
当您从命令行传递\x41时,它将被视为一个由4个字符组成的字符串,因此您可以看到所看到的内容。

现在您已经知道了它为什么不起作用,也许您想知道如何使它起作用。碰巧几年前我也有同样的想法,于是我写了一封信来处理它。

如果您用以下方式调用您的程序,它将起作用:

./prog $'\x41\x41\x41' 
这和

./prog "AAA"
./prog "AAA"