#include<stdio.h>
int main(void) {
char a = "any"; //any string
printf("%c", a);
getch();
}
为什么总是d
(为%c
)或100
(为%d
)获取打印?发生了什么?为什么在将字符串文字分配给char变量时打印字符d?
#include<stdio.h>
int main(void) {
char a = "any"; //any string
printf("%c", a);
getch();
}
为什么总是d
(为%c
)或100
(为%d
)获取打印?发生了什么?为什么在将字符串文字分配给char变量时打印字符d?
char a="any";
未声明任何字符串。您的编译器应该通过错误/警告。您需要
const char *a = "any";
现在
printf("%c", *a);
将打印字符a
为指针a
是指向字符串字面any
的第一要素。
'char a =“any”;'实际上是编译的(虽然它会产生一个警告),并为字符串文字“any”的地址的最低有效字节赋值。 – ajay
您的代码有问题。 On
char a="any";
字符串文字“any”是一个指针,但是您将其保存在(小)整数类型中。因为a的值是地址的一部分,所以它将具有基本上任意的值。在我的机器上打印“T”(如果我删除了getch()行,因为它不能编译)。
GCC提供了以下警告:
warning: initialization makes integer from pointer without a cast
和任何编译器使用的是可能会告诉你类似的东西。你应该认真对待这个警告。
"something between double quotes"
为字符串分配内存并返回指向内存中字符串的指针。您需要使用char *a = "abc";
将此指针存储在a
中现在'a'是指向字符串abc的指针。
printf("%s",a) this will print the entire string abc.
单个字符在这种情况下char a = 'b';
正确使用单引号'a'
。
printf("%c",a) this will print b.
printf("%d",a) this will print the ascii value of 'b', which is 98
字符串总是以null结尾。这是其定义的一部分。所以说'null终止的字符串'是多余的。 – ajay
在声明
char a = "any";
字符串文字"any"
计算结果为这是const char *
类型的第一个字符的地址。将const char *
分配给char
变量会隐式地将指针转换为整数。
warning: initialization makes integer from pointer without a cast [enabled by default]
接下来发生的事情被分配给char
变量a
投整数值的最低显著字节:如果您-W
GCC编译标志发出这下面的警告。这是一个随机值,无法预测。在我的机器上,它恰好是字符/
的ascii代码。在你的机器上,它恰好是100,字符d
的ascii代码。这只是纯粹的机会。没有其他的。
您应该指定一个字符串到const char *
为:
const char *a = "any";
和打印字符串指向a
由%s
转换说明为:
printf("%s\n", a);
还要注意的是getch
不一个C标准库函数,所以你的程序不会在linux机器上编译。不过,你可以使用getchar
来达到同样的效果。
你的代码不应该编译。 – dan04
请注意,'getch'不是'C'标准库函数。它意味着运行Windows的机器。 – ajay
好吧,我明白了。但是现在,为什么我没有收到编译器错误,为什么'd'会一直打印?有人可以解释一下吗? –