printf表现得很奇怪

2 c printf

我有一个简单的程序,应该打印一个字符串.但我没有得到预期的输出.谁能告诉我这个程序有什么问题?

这是我的代码:

main()
{
   char arr[] = "Test_string";
   printf("%20s"+1,arr);
   return 0;
}

output: 20s
Run Code Online (Sandbox Code Playgroud)

预期产出是:Test_string

"Test_string"在我们"%20s"作为格式说明符给出的20个地方打印.

CCo*_*der 6

如果你仔细看看你的printf电话,这很简单.

这是printf的原型:int printf(const char *format, ...);.

printf期望将格式化字符串的指针作为第一个参数.在你的程序中,你传递一个指向这个字符串的指针:"20s"printf迅速打印你传递的内容.

让我解释为什么指针传递指向"20s"而不是"%20s".

C中的带引号的字符串被解释为字符指针. 字符数组,当传递给函数时,会衰减为指针.

printf("%20s",arr); 相当于:

const char * ptr = "%20s";
printf(ptr,arr);
Run Code Online (Sandbox Code Playgroud)

同样printf("%20s"+1,arr);相当于:

const char * ptr = "%20s";
printf(ptr+1,arr);
Run Code Online (Sandbox Code Playgroud)

因为您正在传递"%20s"+1,传递给printf的实际指针指向一个字符串"20s".

  • @ H2CO3:字符串文字的数组元素具有类型`char`,而不是`const char`,根据C 2011 6.4.5 6.它们是只读的,因为第7段说"如果程序试图修改这样的数组,行为是未定义的."但是,尽管是只读的,但由于遗留原因,它们没有`const`属性. (7认同)