我很难掌握 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/