#include <stdio.h>
void main(){
char c[] = "Hello";
char h = c[4];
printf("%s",h);
} 为什么h会导致元素的位置,而不是值?错误是:警告:格式'%s'需要类型为'char *'的参数,但参数2的类型为'int'[-Wformat =]
答案 0 :(得分:0)
声明
printf("%s",h);
引起警告,如您所述
警告:格式'%s'需要类型为'char *'的参数,但参数为2 类型'int'[-Wformat =]
因为h
被声明为char
类型而打印字符变量格式说明符是%c
。因此,使用%c
代替%s
,因为%s
期望char*
类型的参数不是char
类型。
为什么h会导致元素的位置,而不是值?否如果你像printf("%c\n",h);
一样打印它会打印c[4]
所持有的值。
答案 1 :(得分:0)
您没有获得该位置,您将从您的记忆中获取一个随机数。
char h
是一个字符。
char[]
或char*
是一系列字符开头的地址(内存位置),一个接一个。
%s
希望您提供char*
。
您正在给它h
,一个char
。
因此,计算机的作用(出于历史原因)是它可以让你逃脱这个,即使它是错误的(这个警告应该是一个错误)。逃避它意味着它需要存储在h中的字符的ASCII值(并且取决于你是在32位还是64位系统上,在内存中跟随该字符的几个随机字节),所以随机数,并将其解释为一系列字符(char*
)的内存地址,并尝试打印它。
无论如何,这应该会崩溃,但是你“幸运”,因为你最终遇到的数字似乎是程序中的有效内存地址,所以你要打印一些随机字符。
你应该做的是:
#include <stdio.h>
void main(){
char c[] = "Hello";
char h = c[4];
printf("%c",h); // Change %s to %c, which is for char, not char*
}
或者:
#include <stdio.h>
void main(){
char c[] = "Hello";
char h[2] = { 0, 0 }; // Make sure you have an extra "0" at the end that indicates the end of the string.
h[0] = c[4];
printf("%s",h);
}
如果你的编译器足够新,你甚至可以写:
#include <stdio.h>
void main(){
char c[] = "Hello";
char h[2] = { c[4], 0 }; // Make sure you have an extra "0" at the end that indicates the end of the string.
printf("%s",h);
}
对于最后一个变体,但大多数较旧的编译器无法理解(再次,由于历史原因)。