【发布时间】:2021-08-17 04:44:30
【问题描述】:
这是一个很大的问题,所以请花点时间阅读并提供答案。
我的问题是,我们如何在 C 中将输入作为字符串?
我们通常要求用户提供字符数,比如n,我们可以简单地声明为char str[n]。这一切都会很好。
但是,当我们通常声明像char str[100] 这样的大小时。但是如果我们提供一个长度为 20 的字符串,那么 80 个字节被浪费了,我们通常不希望这样,可以吗像这样声明。
如果用户给出一个输入 120 的字符串,那么我们的字符数组中只会存储 100 个字符,我们也不希望这样。
所以,基本上我们不知道用户可能输入什么。他输入一串长度,他的选择。
在上述情况下,我们使用scanf 或gets 获取输入,例如scanf("%s", str)、scanf("%[^\n]%*c", str)、scanf("%[^\n]s",str)、gets(str) 等。
当我们使用 scanf 时,当我们输入一个长度为 5 的字符串时,当我们输入 6 个字符时,第 6 个字符不会被存储。
当我们使用 puts 时,当我们输入一个长度为 5 的字符串时,当我们给出 6 个字符时,第 6 个字符将存储在连续的字节中,但是当我们尝试打印时第 6 个字符不会显示.当我们输入 6 个字符时,它会给出一条消息,例如“检测到堆栈粉碎”。我们不知道还有什么其他数据,它可能会被覆盖。
上述案例是对是错,请您帮帮我?
现在,还有另一种声明 String 并将输入作为字符串的方法,我们可以使用指针,就像我们可以动态分配内存,然后在处理完字符串时释放内存。我们使用like,malloc,calloc,realloc 来分配内存,free 来释放内存。
我们可以声明为char* str = (char*)malloc(size*sizeof(char)),我们将输入作为scanf("%[^\n]s",str)。但在这里,我们也需要提供尺寸。如果我们不知道大小怎么办?如果用户提供的输入大于大小怎么办?
我们也可以像char* str = (char*)malloc(sizeof(char)) 这样声明。在这里,当我们输入一个长度为 5 的字符串时。字符串以连续字节的形式存储在堆中,但我们只分配了 1 个字节,我们输入的剩余 4 个字节以某种方式存储,这基本上是非法的内存访问,我们不能这样做,对吗?
上面提到的2种情况是一样的,这是对还是错?你能帮帮我吗?
我在 Zugzwang,国际象棋术语。请你帮助我好吗?有哪些方法可以在不指定大小的情况下声明字符串并获取输入?我们可以在不指定大小的情况下动态分配吗?声明字符串的方法有哪些?
【问题讨论】:
-
如何为字符串输入创建一个缓冲区,该缓冲区对您的用例而言具有最大大小,例如
char buf[4096]。然后,接受buf的输入,然后接受strlen(buf)的输入,并使用该值动态分配实际字符串。 -
典型实现实际上读取到数组的大小,并将输入的其余部分作为垃圾丢弃。如果您希望某些东西能够存储任何大小的输入,您可以实现一个动态分配内存的函数,并继续读取输入并重新分配它以尽可能多地扩展字符串的内存空间,但最终您会必须设置一个限制,并丢弃无法读取的内容,因为内存空间不是无限的。
-
嘿PHD,我会这样做,但是缓冲区不会自己在堆栈上占用空间,在函数结束后,空间会被清除,对吗?无论如何要明确删除内存,buf [4096]。
-
嘿user3766054,我会检查一下
标签: arrays c string pointers input