当我将字符串文字分配给char变量时,为什么要打印字符?

时间:2014-02-14 16:21:12

标签: c variables

#include<stdio.h>

int main(void) {
    char a = "any"; //any string
    printf("%c", a);
    getch();
}

为什么总是d(对于%c)或100(对于%d)会被打印出来?发生了什么事?

4 个答案:

答案 0 :(得分:4)

char a="any";未声明任何字符串。您的编译器应该通过错误/警告。你需要

const char *a = "any";   

现在

printf("%c", *a);

将打印字符a,因为指针a是指向字符串文字any的第一个元素的指针。

答案 1 :(得分:3)

您的代码存在问题。上

char a="any";

字符串文字“any”是一个指针,但是你将它保存在(小)整数类型中。因为a的值是地址(的一部分),所以它将具有基本上任意的值。在我的机器上它打印“T”(如果我删除了getch()行,因为它不能编译)。

GCC发出以下警告:

warning: initialization makes integer from pointer without a cast

和你使用的任何编译器可能会告诉你类似的东西。你应该认真对待这个警告。

答案 2 :(得分:0)

"something between double quotes" 

为字符串分配内存并返回指向内存中字符串的指针。你需要使用a将此指针存储在char *a = "abc";中,现在'a'是指向字符串abc的指针。

printf("%s",a) this will print the entire string abc.

对于单个字符,在这种情况下使用单引号'a' char a = 'b';是正确的。

printf("%c",a) this will print b.
printf("%d",a) this will print the ascii value of 'b', which is 98

答案 3 :(得分:0)

声明

char a = "any";

字符串文字"any"计算其第一个字符const char *的地址。将const char *分配给char变量会隐式地将指针转换为整数。如果使用-W gcc标志进行编译,则会发出以下警告:

warning: initialization makes integer from pointer without a cast [enabled by default]

接下来发生的是,将整数值的最低有效字节分配给char变量a。这是随机值,无法预测。在我的机器上,它恰好是角色/的ascii代码。在您的机器上,它恰好是100,即字符d的ascii代码。这只是纯粹的机会。没别了。

您应该将字符串文字分配给const char *

const char *a = "any";

并将a转化说明符%s指向的字符串打印为:

printf("%s\n", a); 

另请注意,getch不是C标准库函数,因此您的程序无法在Linux机器上编译。但是,您可以使用getchar获得相同的效果。