2014-02-14 44 views
0
#include<stdio.h> 

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

为什么总是d(为%c)或100(为%d)获取打印?发生了什么?为什么在将字符串文字分配给char变量时打印字符d?

+2

你的代码不应该编译。 – dan04

+2

请注意,'getch'不是'C'标准库函数。它意味着运行Windows的机器。 – ajay

+0

好吧,我明白了。但是现在,为什么我没有收到编译器错误,为什么'd'会一直打印?有人可以解释一下吗? –

回答

4

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

const char *a = "any"; 

现在

printf("%c", *a); 

将打印字符a为指针a是指向字符串字面any的第一要素。

+0

'char a =“any”;'实际上是编译的(虽然它会产生一个警告),并为字符串文字“any”的地址的最低有效字节赋值。 – ajay

3

您的代码有问题。 On

char a="any"; 

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

GCC提供了以下警告:

warning: initialization makes integer from pointer without a cast 

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

+0

在我的机器上,它打印'/'。 :)我得到了一个'警告:初始化从指针中取得整数而没有强制转换[默认启用]'。 – ajay

+0

我使用DevC++编译器,它显示相同的警告。主席先生,我还是不明白。为什么字符串文字在这里是一个指针? –

+0

在这种情况下,字符串文字会衰减(隐式转换)为指向其第一个字符的指针。还有其他情况下,字符串的行为相似。 – ajay

0
"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 
+1

字符串总是以null结尾。这是其定义的一部分。所以说'null终止的字符串'是多余的。 – ajay

0

在声明

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来达到同样的效果。

相关问题