c - 理解 C 中的 gets() 函数

标签 c arrays pointers gets

我很难掌握 C 中的一些概念,并且对 Greg Perry 的《C 编程绝对初学者指南》中的一些内容感到困惑。

在书的最后,作者提到了函数 gets() 的工作原理。他说它返回一个字符指针,该指针指向用户输入的字符串的开头。如果是这样的话(请原谅我无知。我对此真的很陌生)它是如何返回字符串的其余部分的? 我的猜测是,它将一个字符数组存储为完整的,并将其存储为第一个元素,如下所示:

char * names[5] = {"name1","name2","name3"};

从那里我们可以做类似的事情

printf("%s\n",*(names));

这将打印“name1”,因为它实际上返回数组的第一个位置。 但是像这样的事情呢:

gets(names);
printf("%s\n",*(names));

上面的例子编译得很好,但是当我运行它时会出现段错误,如果我这样做的话。

我确信我可能没有正确解释这本书,但在我看来,作者好像说 gets 分配(在上面的示例中)用户在 gets(names) 中输入的任何内容作为第一个数组元素,如下所示整体而不是部分,我能做的最多就是打印我输入的名字的第一个字母。

我一直对这些小事情着迷,因为我觉得它们可以帮助我更好地理解 C 编程(以及整个编程),所以我绝对会感激任何能够为我指明正确方向的人。

最佳答案

C 中的字符串只是内存中连续的字符序列。该函数返回一个指向第一个字符的指针,并且通过指针算术,您可以查看其余的字符。没有“返回字符串的其余部分”:基本上,它返回类似“嘿,这是一个指向字符串开头的指针。您可以从该位置开始读取”。

例如,如果p是指向第一个字符的指针,则p+1是指向下一个字符的指针,依此类推。字符串以 null 结尾,因此您知道何时停止。

旁注:gets() 非常危险,因为它容易受到缓冲区溢出的影响;它已经过时了。没有人应该再使用它了。改为阅读 fgets()

gets() 名称无效,存在直接类型不匹配。 names 衰减为 char **,而 gets() 需要一个 char *。此外,您还必须提供指向有效内存位置的指针。

如果您像这样声明名称:

char names[128];

那么gets(names)将是有效的。请注意,gets() 无法知道 names 最多可以容纳 128 个字符,这就是您应该使用 fgets() 的原因,它接收缓冲区的大小作为附加参数,因此它知道其限制。

关于c - 理解 C 中的 gets() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22052451/

相关文章:

c++ - 使用复制构造函数时,是否在复制构造函数之前初始化了类数据成员?

c - 如何在C中复制矩阵?

c++ - 混合使用 C(99) 和 C++ 的复数类型

python - 如何将数组中的零转换为Nan?

arrays - 无法在 Bash Shell 脚本中打印整个数组

javascript - Q.allSettled 在将任何内容推送到数组之前执行

C 函数在第一次运行中返回正确结果,但在第二次以上运行中返回错误结果

c - 需要将 c 中文件中的值转换为 int/float

c - 使用 strtok 的段错误

C ascii 到 hex 代码