2010-08-31 122 views
4

我正在通过“Learn C”书阅读,并且遇到了一个我真不明白的问题。在练习的要点是找到这段代码的问题:基本C指针问题

char c; 

c = 'a'; 

printf("c holds the character %c.",c); 

..和那么它给出的解释是:“文本字符串‘a’是由两个字符,这两个‘A’和终止零字节变量c只有一个字节的大小,即使c是2字节长,也不能以这种方式拷贝一个文本字符串,尝试一次拷贝一个字节的文本到足够大的变量中该文本字符串及其终止的零字节。“

但是,当我运行上面的代码 - 它工作得很好。我想我明白为什么的背后它是坏的理论 - 将整体在一串东西年底终止0,所以我改写这样的代码进行测试:

char c[2]; 

*c = 'a'; 

printf("c holds the character %c.",c); 

但是,这产生一个问题。我开始对这个问题感到困惑。这第二组代码是不是将字母'a'传递给c [0]处的指针,然后将终止0置于c [1] - 完全使用分配给该数组的2个空格?

+3

我不假设在第二行有一个双引号? (c =“a”;)这将无法编译...因为单引号是一个字符,而任何用双引号是一个字符串(所以以null结尾) – Rudu 2010-08-31 21:16:05

+0

你的第一个例子是100%正确的,没有问题用它。你确定你把它正确地复制了吗? – 2010-08-31 21:16:23

+0

谢谢你们,你是对的 - 书中的例子有双引号。但他们没有提到答案中指出的一点,即双引号是空字符结束的,单引号只是一个字符。谢谢。 – startuprob 2010-08-31 21:28:04

回答

8

该文本是错误的,否则你正在抄写代码不正确。

在C中,双引号字符串以空值终止。单引号字符只是一个字符。

+0

该文本最多有点误导,但它是正确的。 – jdehaan 2010-08-31 21:51:13

+1

它给出的代码没有问题。如果这本书说用正确的代码找到一个“问题”,那么这本书是错误的。 – 2010-08-31 22:23:59

2

在C中,单引号表示字符常量。

9

的解释:“文本字符串‘a’是由两个字符,这两个‘A’和结尾的零字节

这是真实的,但'a'"a"'a'为单个字符,所以'a'char非常适合

一个写一个字符转换成字符串应该是这样的例子:。

char str[2]; 
str[0] = 'a'; 
str[1] = 0; /* because nothing guarantees array items are initialized to 0 */ 
printf("str holds the string %s.", str); 
2

在你的第二个例子的代码段,c被解释为指针的第一个元素的阵列中(即作为char *),而不是作为char。你既可以做:

printf("c holds the character %c.", *c); 

printf("c holds the character %c.", c[0]); 

printf("c holds the character %s.", c); 

在最后一个示例中,%s告诉printf()期待一个字符串,而不是一个字符。但是,在这种情况下,您必须将c[]的第二个元素设置为“空终止符”(例如使用c[1] = '\0'),否则printf()将不知道字符串结束的位置,并且可能会打印无限量的垃圾。

0

在C中,'c'是单个字符,而“c”是字符串。 (注意双引号)。本书作者对占用2个字节的变量的解释仅适用于第二种情况。

在您的第一个代码段中,您将一个完全有效的1字节char分配给char变量并进行打印。所以它工作。

在你的第二个代码段中,你将一个字符赋值给char数组(如果你想把它称为一个字符串)而不是'null-terminating'它。当你调用它的printf函数时,printf不知道字符串在哪里结束。因此printf的行为在这里未定义。

0

本书所示的解释有些不对劲。 'a'是单个字符(注意单引号),“a”是一个字符串。 现在“a”确实是0x00终止。但'一个'不是。

我现在的结论是,当你从书中复制信息时出现乱码......或者......“学习C”这个标题是本书作者的目标。

1

C中的字符串实际上是字符数组。所以char c [2];是c的声明,它是一个包含2个元素的字符数组。用'a'分配它是错误的,因为它是一个字符文字,你应该给它分配一个字符串文字“a”。只要记住早先评论所述的单引号和双引号之间的区别。

0

在C单引号描述单个字符,即 'A' 而在双引号 “一个” 它弥补了空teminated串

所以这

int main(void) 
{ 
    char s[2]="a"; 

    // s='a'; leads to error incompatible types......... 
    printf("%s",s); 

    return 0; 
} 

将正常工作

0

在单引号C中编写一个字符:'a'和双引号中的一个字符'a'具有不同的含义。

通过将一个字符放在单引号中,表示要将'a'解释为一个单个字符,因此不会添加终止的空字节。

如果您要将您的角色放在双引号内,那么它将被声明为一个字符串。在这种情况下,终止空字节会自动连接到结尾,您不必担心。生成的字符串是:

"a/0"

如果你想你的str变量初始化字符串“一”只使用单引号,那么你就必须在明确添加终止空字节。

char str[2]; 
str[0] = 'a'; 
str[1] = '/0'; 
printf("str holds the string %s.", str); 

否则,您可以使用双引号将str的第一个索引初始化为“a”,并且终止空字节将自动添加到第二个索引处。

char str[2]; 
str[0] = "a";