坚持做C练习:数组和字符串

时间:2014-12-31 03:45:12

标签: c

(前言:我根本不是程序员,但我正在研究它,所以我可以对它的工作方式有所了解,所以请忍受我的无知!)

我一直在c.learncodethehardway.org上完成C语言教程。当我在9号卡住时,进行了大约8次练习。这是链接:

http://c.learncodethehardway.org/book/ex9.html

我几乎掌握了所有这一切,除非它让作者在"你应该看到的"部分。这是相关代码的复制/粘贴:

#include <stdio.h>

int main(int argc, char *argv[])
{
int numbers[4] = {0};
char name[4] = {'a'};

// first, print them out raw
printf("numbers: %d %d %d %d\n",
        numbers[0], numbers[1],
        numbers[2], numbers[3]);

printf("name each: %c %c %c %c\n",
        name[0], name[1],
        name[2], name[3]);
printf("name: %s\n", name);

// setup the numbers
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;

// setup the name
name[0] = 'Z';
name[1] = 'e';
name[2] = 'd';
name[3] = '\0';

// then print them out initialized
printf("numbers: %d %d %d %d\n",
        numbers[0], numbers[1],
        numbers[2], numbers[3]);

printf("name each: %c %c %c %c\n",
        name[0], name[1],
        name[2], name[3]);

// print the name like a string
printf("name: %s\n", name);

// another way to use name
char *another = "Zed";

printf("another: %s\n", another);

printf("another each: %c %c %c %c\n",
        another[0], another[1],
        another[2], another[3]);

return 0;
}

程序在屏幕上打印的内容如下所示:

numbers: 0 0 0 0
name each: a   
name: a
numbers: 1 2 3 4
name each: Z e d 
name: Zed
another: Zed
another each: Z e d
$

在本教程中,令我困惑的是作者的这句话:

&#34;当打印每个名称元素时,只有第一个元素&#39; a&#39;显示是因为&#39; \ 0&#39;角色很特别,不会显示。&#34;

我发现这很奇怪,因为我将名称定义为&#39; a&#39;在顶部,但我从来没有喊出过&#39; \ 0&#39; 之后的字符我第二次打印名称变量。

为什么不用“a a a a a a”打印,就像打印出的数字一样&#39; 0 0 0 0&#39;?是否与“&#39; &#39;在一个?

4 个答案:

答案 0 :(得分:5)

  

为什么不用'a a a a'打印,与打印的数字相同   出'0 0 0 0'?

因为未给定显式初始值设定项的任何数组值(在初始化数组中)都会默认初始化为零。 ('\ 0'只是将NUL /零值指定为字节的另一种方式)

  

是否与a'周围有关?

不,只是那个

char name[4] = {'a'};

在逻辑上等同于:

char name[4] = {'a', 0, 0, 0};

在逻辑上等同于:

char name[4] = {'a', '\0', '\0', '\0'};

请注意,任何与C字符串兼容的函数(包括printf())都会将零字节识别为指示字符串的结尾,并在遇到零字节时停止读取该字符串。这就是为什么只打印“a”。

答案 1 :(得分:1)

大多数C编译器会使用整数0自动初始化未指定的数组值。这不仅适用于整数数组,也适用于字符数组。

现在,字符文字\0的值为0.而在C中,字符值存储为ASCII值。因此,当编译器将0添加到字符数组的其余部分时,它们将被视为\0文字或null,这也用于标记字符串的结尾。

作为证据,在您的示例中,如果使用

替换单个字符数组元素的print语句
printf("name each: %c %d %d %d\n",name[0], name[1], name[2], name[3]);

你会发现它打印出来:

name each: a 0 0 0

这是因为我们使用了%d格式说明符,它是整数值而不是%c格式说明符,它需要一个字符值。由于整数值零与\0相同,因此字符串终止。

答案 2 :(得分:0)

因为你使用的东西是:

char name[4] = {'a'};

名称[0] = a ,其余没有任何内容(仅限&#39; \ 0&#39;),其余我的意思是名称[1],名称[2] ,...

答案 3 :(得分:0)

为什么通过阅读被称为K&amp; R C,第2版的书,以简单的方式学习C语言是“艰难的”。