gpt4 book ai didi

c - K&R - 第 1.9 节 : understanding character arrays (and incidentally buffers)

转载 作者:行者123 更新时间:2023-12-01 15:27:21 31 4
gpt4 key购买 nike

先从一个很基础的关于字符数组的问题说起,我从书中的描述看不懂:

  • 是否每个字符数组都以'\0'结尾?
  • '\0' 的长度是否总是等于字符数 + 1?
    • 意思是如果我指定长度为 10 的字符数组,我将只能存储 9 个不是“\0”的字符?
    • 或者 '\0' 是否在最后一个数组槽之后,所以所有 10 个槽都可以用于任何字符,而第 11 个不可到达的槽将包含 '\0' 字符?

进一步研究本节中的示例,它定义了一个 getline() 函数,该函数读取一个字符串并计算其中的字符数。 you can see the entire code here (in this example getline() was changed to gline(), since getline() is already defined in newer stdio.h libraries)
函数如下:

int getline(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';
return i;
}

说明数组以这种方式存储输入:
[h][e][l][l][o][\n][\0]
该函数将返回 6 的计数,包括 '\n' 字符,但这仅在循环因为 '\n' 字符而退出时才成立。
如果循环因为达到极限而退出,它将返回一个像这样的数组(据我所知):
[s][n][a][z][z][y][\0]
现在计数也将是 6。
如果“snazzy”明显比“hello”长,比较两个字符串将返回它们相等,所以这段代码有一个错误(根据我的个人要求,因为我不想将 '\n' 算作字符串的一部分)。

为了解决这个问题,我尝试(在许多其他事情中)删除将 '\n' 字符添加到数组而不是递增计数器,我偶然发现当输入的字符多于数组可以存储的字符时,多余的字符会在输入缓冲区中等待,稍后将传递给 getline() 函数,所以如果我输入:
“时髦的哈哈\n”
它会像这样用完它:
第一个 getline() 调用:[s][n][a][z][z][y][\0]
第二个 getline() 调用:[ ][l][o][l][z][\n][\0]

此更改还引入了一个有趣的错误,如果我尝试输入恰好 7 个字符长的字符串(包括 '\n'),程序将立即退出,因为它会将 '\0' 字符传递给下一个字符getline() 调用将返回 0 并退出在 main() 中调用 getline() 的 while 循环。

我现在对下一步该做什么感到困惑。我怎样才能让它既不计算 '\n' 字符又避免它造成的错误?

非常感谢

最佳答案

C 中有一个约定,即字符串以空字符结尾。根据该惯例,您所有的问题都是基于。所以

  • 是否每个字符数组都以'\0'结尾?

不,它以\0 结尾,因为程序员把它放在那里了。

  • '\0' 的长度是否总是等于字符数 + 1?

是的,但只是因为这个约定。除此之外,例如你分配比字符串长度多一个字节(char)来容纳这个\0。

字符串存储在字符数组中,例如char s[32];char *s = malloc(strlen(name) + 1);

关于c - K&R - 第 1.9 节 : understanding character arrays (and incidentally buffers),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35243498/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com