gpt4 book ai didi

c - K&R答题簿-习题1.16-getline函数

转载 作者:太空宇宙 更新时间:2023-11-03 23:50:30 24 4
gpt4 key购买 nike

“修改最长行程序的主例程,使其正确打印任意长输入行的长度,以及尽可能多的文本。”

这是练习 1.16 的 K&R 答案书中的完整代码:

#include <stdio.h>
#define MAXLINE 1000

int getline (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 = getline(line, MAXLINE)) > 0 ){
printf("%d %s", len, line);
if (len >max){
max = len;
copy (longest, line);
}
}
if (max > 0)
printf("%s", longest);

getchar();
return 0;
}
int getline(char s[], int lim)
{
int c, i, j;

j = 0;
for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
if (i < lim-2){
s[j] = c;
++j;
}
if (c == '\n'){
s[j] = c;
++j;
++i;
}
s[j] = '\0';
return i;
}
void copy (char to[], char from[])
{
int i;

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

查看 getline 函数,在以下行中使用 lim-2 而不是 lim-1 的目的是什么:

if (i < lim-2){

这似乎根本没有任何作用。 '\0' 字符标记不应该出现在 s[lim] 而不是 s[lim-1] 或 s[lim-2] 处吗?

此外,如果超过字符限制,该函数将跳过最新字符,直到找到换行符,并将换行符添加到 char 字符串,但跳过下一个“适合”字符来自流程中的输入流。这是什么目的?

我不太确定作者在这里的意图,而且这本书没有提供任何解释。

编辑:使用诸如行 [5] 之类的数组,我的印象是字符数组中的 NULL 字符位于行 [5] 中,我们可以在数组下标 0-4 中放置一些内容。这个假设是错误的吗?

最佳答案

This doesn't seem to serve any purpose at all. Shouldn't the '\0' character marker occur at s[lim] and not s[lim-1] or s[lim-2]?

没有。 lim 是缓冲区的大小,因此数组的最后一个索引是 lim-1。代码使用 lim-2 是因为它为结束字符串字符 ('\0') 和换行符 ("\n") 保留了空间。

Also, the function skips whatever the latest character was, if it goes over the character limit, until it finds a new line character, and it adds the newline character to the char string, but skips whatever the next "fittable" character coming from the input stream in the process. What is this purpose of this?

getline 函数读取分成不同大小 MAX_LINE block 的输入字符串,然后将这些 block 复制到 longest 缓冲区中。由于 longest 缓冲区具有固定大小,因此可以打印的字符串的最大长度为 MAX_LINE(即仅第一个 block )。因此,longest 缓冲区的大小是您可以打印出的字符串的实际限制,即使您在输入中插入了更长的字符串。练习包括使 longest 缓冲区动态化,以便应用程序能够读取和打印任意长字符串。您必须使用动态内存,因为您不知道输入字符串的大小。一个可能的解决方案是将每个 block 保存到一个临时缓冲区中,当所有缓冲区都在内存中时,您可以计算输入字符串的大小,然后将所有 block 复制到一个新的缓冲区中,该缓冲区的大小是输入字符串的长度。

关于c - K&R答题簿-习题1.16-getline函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20817144/

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