为什么我们需要在在C字符数组的末尾添加“\ 0”(空)? 我在K&R 2(1.9字符数组)读取。 在这本书中的代码,以找到最长的字符串如下:
#include <stdio.h>
#define MAXLINE 1000
int readline(char line[], int maxline);
void copy(char to[], char from[]);
main() {
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];
max = 0;
while ((len = readline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0)
printf("%s", longest);
return 0;
}
int readline(char s[],int lim) {
int c, i;
for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0'; //WHY DO WE DO THIS???
return i;
}
void copy(char to[], char from[]) {
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
我的问题是,为什么我们设定的字符数组为“\ 0”的最后一个元素? 该项目工程没有它罚款...请帮我...
你需要结束的C字符串用'\0'
,因为这是图书馆如何知道哪里的字符串结尾(和你的情况,这是什么样copy()
函数需要)。
该项目工程罚款没有它...
没有它,你的程序未定义的行为 。 如果这个程序碰巧你希望它做的事情,你只是幸运(或者说,不吉利,因为在现实世界中的不确定的行为会选择体现在最不方便的情况下)。
在C“串”是指字符的空字符结尾的阵列。 用帕斯卡串,这意味着至多255个本地字符由指示字符串的长度(但无需终止)一个字节preceeded进行比较。
每个appraoch都有它的优点和缺点。
特别是字符串指针指向而不长度已知字符数组是唯一的方法NULL
终止将确定字符串的长度。
约在NULL终止真棒讨论链接
因为C定义一个字符串作为通过终止字符的连续序列,并且包括第一个空字符 。
基本上C的作者有选择以限定一个字符串作为字符序列串的+长度或者使用魔法标记来分隔字符串的末尾。
有关主题的更多信息,我建议阅读这篇文章:
“最昂贵的一个字节的错误”由波尔·亨宁·卡普http://queue.acm.org/detail.cfm?id=2010365
实际上,你自己写的答案就在这里:
void copy(char to[], char from[]) {
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
在这个函数中的循环将继续,直到它从该阵列中遇到“\ 0”。 如果没有终止零循环将continure未知号码的步骤,直到遇到一个零或一个无效的存储器区域。
真的,你不需要通过\ 0结束的字符数组。 它是字符*,或者需要由它结束的字符串C表现。
至于数组,你有它结束后添加\ 0,如果你想(通过字符*申述)将其转移到字符串。
在另一方面,你需要有\ 0在数组的结尾,如果要解决这个问题为char *,并计划在其上使用的char *功能。
'\0'
阵列中的表示字符串的结束,这意味着在这之后的字符不被认为是string.It的部分,并不意味着它们不是字符阵列的一部分的任何字符。 即,我们仍然可以访问这些字符通过索引,但他们只是不属于我们调用字符串相关的东西到这个字符数组。
对于一个字符串,在适当的格式,并能够与字符串函数正常工作,它必须是一个空终止字符数组。 如果没有NULL,程序显示不确定的行为,当我们的字符数组上调用字符串函数。 尽管我们可能会得到幸运的结果大多数时候,它仍然是一个不确定的行为。
这是字符串终止符,当此遇到,编译器都知道您的字符串结束。