Can';char数组的t-print元素

Can';char数组的t-print元素,c,codeblocks,kernighan-and-ritchie,C,Codeblocks,Kernighan And Ritchie,我有点困惑。 我用纯C语言编写。以下代码不起作用: char arr[] = "0x123"; printf(arr[0]); 这只是一个例子 IDE(代码::Blocks)生成以下信息:程序接收信号SIGSEGV,信号故障 为什么此代码不起作用?使用 printf("%c",arr[0]); 如果使用llvm/clang,要获取数组的第一个元素,编译器将发出一个相当不言自明的警告: test.c:3:9: warning: format string is not a string lit

我有点困惑。 我用纯C语言编写。以下代码不起作用:

char arr[] = "0x123";
printf(arr[0]);
这只是一个例子

IDE(代码::Blocks)生成以下信息:程序接收信号SIGSEGV,信号故障

为什么此代码不起作用?

使用

printf("%c",arr[0]);

如果使用llvm/clang,要获取数组的第一个元素,编译器将发出一个相当不言自明的警告:

test.c:3:9: warning: format string is not a string literal (potentially insecure) [-Wformat-security]
        printf(a[0]);

这意味着您应该提供一个格式化字符串作为第一个参数,例如,
printf(“%c”,arr[0])

您尝试执行的操作不起作用,因为
printf
函数中使用的参数不正确
printf
的名称如下:

printf ( const char * format, ... )
如您所见,它至少需要一个格式字符串的参数,并且可以接受省略号(
)指示的任意数量的附加参数

格式字符串可以包含任意数量的格式说明符,在这些格式说明符处将打印附加参数的值。请注意,格式说明符和附加参数的数量和类型必须匹配

您所做的错误是提供了非法的格式字符串。如果要打印数组中的字符,格式字符串必须包含字符的格式说明符,该字符是
%c
。还必须提供实际值作为附加参数。这意味着对于数组中的第0个字符,
printf
应该如下所示:

printf("%c", arr[0]);

因为
printf
需要指向nul结尾的字符串的指针,而不是单个字符。请检查printf语法。这是正确的建议,但如果能够解释现有代码错误的原因,这会更好。您可能会提到
printf(“%s\n”,arr)作为另一个选项。