gpt4 book ai didi

C 中的字符数组?

转载 作者:行者123 更新时间:2023-11-30 20:54:38 25 4
gpt4 key购买 nike

我是 C 编程语言的初学者,我对 C 编程语言中的空字符('\0')感到非常困惑。

根据下面的程序,一行允许的字符长度为 10(MAXLINE 定义为 10)。像 Navindren 这样长度为 9 的输入占用数组索引 08,每当到达新行字符时,它就会添加到索引 >9i 增加 1i 现在是 10,并且 s[10] 被分配了 '\0's [10] = '\0'.

这里很困惑,因为数组仅从索引 0- 9 分配空间,这怎么可能?我尝试引用许多在线资源,但解释不够充分。

主要功能:

#include<stdio.h>
#define MAXLINE 10

int getline(char line[], int maxline);
void copy(char to[], char from[]);

main() {
int len; /*current line length*/
int max; /*maximum length seen so far*/
char line[MAXLINE]; /*current input line*/
char longest[MAXLINE]; /*longest line saved here*/

max = 0;
while ((len = getline(line, MAXLINE)) > 0) {
printf("%d\n", len);
if (len > max) {
max = len;
copy(longest, line);
}
}

if (max > 0) /* there was a line */ {
printf("%s", longest);
} else {
printf("No Lines Detected\n");
}

return 0;
}

获取线函数:

int getline(char s[], int lim) {
int c;
int i;

for (i = 0; i < MAXLINE - 1 && (c = getchar()) != EOF && c != '\n'; i++) {
s[i] = c;
}

if (c == '\n') {
s[i] = '\n';
++i;
}

s[i] = '\0';
return i;
}

复制功能:

/*copy: copy `from` into `to`; assume to is big enough*/
void copy(char to[], char from[]) {
int i;
i = 0;

while ((to[i] = from[i]) != '\0') {
++i;
}
}

最佳答案

getline函数在 i 时停止达到9或者当从文件读取的下一个字节是 '\n' 时。在循环结束时不能同时满足两个条件,因此 '\n'仅在 i 时添加小于 9 ,所以无效位置s[10]永远不会存储到。

假设输入文件包含字节:

+---+---+---+---+---+---+---+---+---+---+
| N | a | v | i | n | d | r | e | n |\n |
+---+---+---+---+---+---+---+---+---+---+

以下是 getline() 执行的步骤:

  • i = 0 (循环初始化语句,执行一次)
  • i < 9 -> 正确
  • c = getchar() -> c收到'N'
  • c != EOF -> 正确
  • c != '\n' -> 正确
  • s[i] = c -> s[0]收到'N'
  • i++ -> i现在是1

循环重复上述步骤,直到 s[8]收到'n'i增加到9 .

最后的步骤是:

  • i < 9 -> false,退出循环。
  • if (c == '\n') -> 假,c包含'n' ,不是'\n' ,换行符尚未被读取。 if分支被跳过。
  • s[i] = '\n' -> s[9]接收空字节 '\0' .
  • return i; -> 值9返回给调用者。

您的 getline() 的实现确实存在问题:您传递目标数组大小的参数,但代码使用硬编码值 MAXLINE相反。

除了这个问题之外,其行为与fgets()非常相似。 。您是打算这样还是打算读取没有尾随换行符的行,作为过时的不安全函数 gets()用来做什么?

关于C 中的字符数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38542415/

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