gets() 函数和 '\0'输入中的零字节

发布于 2024-10-18 13:28:15 字数 333 浏览 0 评论 0原文

如果 C 语言(例如 glibc)的 gets() 函数从文件中读取零字节 ('\0'),它会停止吗?

快速测试:echo -ne 'AB\0CDE'

谢谢。

PS这个问题来自这个问题的评论:return to libc - Problem

PPS the gets function是危险的,但这是一个关于这个功能本身的问题,而不是关于任何人是否应该使用它的问题。

Will the gets() function from C language (e.g. from glibc) stop, if it reads a zero byte ('\0') from the file ?

Quick test: echo -ne 'AB\0CDE'

Thanks.

PS this question arises from comments in this question: return to libc - problem

PPS the gets function is dangerous, but it is a question about this function itself, not about should anybody use it or not.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

叫思念不要吵 2024-10-25 13:28:15

gets() 的行为是当遇到换行符或遇到 EOF 时停止。它不关心是否读取 \0 字节。

C99 标准,7.19.7.7

剧情简介

 #include ;

   char *gets(char *s);

描述

gets 函数从 stdin 指向的输入流中读取字符,并将其存入
s 指向的数组,直到遇到文件结尾或读取换行符。
任何换行符都会被丢弃,并且紧随其后写入一个空字符
最后一个字符读入数组。

来自 GNU libc 文档: http://www. gnu.org/software/libc/manual/html_node/Line-Input.html#Line-Input

— 已弃用的函数:char * gets (char *s)

函数gets从流stdin中读取字符直到下一个换行符,并将它们存储在字符串s中。换行符被丢弃(请注意,这与 fgets 的行为不同,后者将换行符复制到字符串中)。如果gets遇到读取错误或文件结尾,则返回空指针;否则返回 s。

The behavior of gets() is that it stops when a newline character is encountered or if EOF is encountered. It does not care if it reads \0 bytes.

C99 Standard, 7.19.7.7

Synopsis

   #include <stdio.h>

   char *gets(char *s);

Description

The gets function reads characters from the input stream pointed to by stdin, into the
array pointed to by s, until end-of-file is encountered or a new-line character is read.
Any new-line character is discarded, and a null character is written immediately after the
last character read into the array.

From GNU libc documentation: http://www.gnu.org/software/libc/manual/html_node/Line-Input.html#Line-Input

— Deprecated function: char * gets (char *s)

The function gets reads characters from the stream stdin up to the next newline character, and stores them in the string s. The newline character is discarded (note that this differs from the behavior of fgets, which copies the newline character into the string). If gets encounters a read error or end-of-file, it returns a null pointer; otherwise it returns s.

过气美图社 2024-10-25 13:28:15

它不会停在零字节。

$ cat gets22.c
int main(int argc, char **argv) {
  char array[8];
  gets(array);
  printf("%c%c%c%c%c%c%c\n",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]);
  printf("%d %d %d %d %d %d %d\n",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]);
}

$ gcc gets22.c  -o gets22

$ echo -ne 'AB\0CDE'| ./gets22
ABCDE
65 66 0 67 68 69 0

It will not stop at zero byte.

$ cat gets22.c
int main(int argc, char **argv) {
  char array[8];
  gets(array);
  printf("%c%c%c%c%c%c%c\n",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]);
  printf("%d %d %d %d %d %d %d\n",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]);
}

$ gcc gets22.c  -o gets22

$ echo -ne 'AB\0CDE'| ./gets22
ABCDE
65 66 0 67 68 69 0
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文