首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么fgets重置我的双指针元素?

fgets函数是C语言中用于从文件中读取字符串的函数。它的原型为:

代码语言:txt
复制
char *fgets(char *str, int n, FILE *stream);

其中,str是一个指向字符数组的指针,用于存储读取到的字符串;n是要读取的最大字符数(包括空字符);stream是一个指向FILE对象的指针,指定要从中读取字符串的文件。

在使用fgets函数读取字符串时,需要注意以下几点:

  1. fgets函数会读取指定的最大字符数(n-1)个字符,或者遇到换行符('\n')为止,以先到者为准。读取到的字符串会自动添加一个空字符('\0')作为结尾。
  2. 如果读取到的字符串长度小于n-1个字符,fgets函数会将换行符('\n')也一并读取并存储在字符串中。
  3. 如果读取到的字符串长度等于n-1个字符,fgets函数会将换行符('\n')存储在字符串中,并且确保字符串以空字符('\0')结尾。
  4. 如果fgets函数无法读取到任何字符(即文件结束或发生错误),它会返回一个空指针(NULL)。

根据上述特性,当使用fgets函数读取字符串时,如果输入的字符串长度超过了指定的最大字符数,fgets函数会将超出部分的字符截断,并将其余部分存储在字符串中。这可能导致双指针元素被重置,因为fgets函数会修改字符串的内容。

为了避免fgets函数重置双指针元素,可以采取以下措施:

  1. 确保输入的字符串长度不超过指定的最大字符数。可以使用strlen函数获取字符串的长度,并与最大字符数进行比较。
  2. 在读取字符串之前,备份双指针元素的值。可以使用临时变量存储双指针元素的值,并在fgets函数调用后恢复。

需要注意的是,fgets函数只负责读取字符串,不会对双指针元素进行任何修改。如果双指针元素的值发生了变化,可能是其他代码对其进行了修改。

以上是关于fgets函数的解释和相关注意事项。如果您需要更多关于C语言、云计算或其他相关主题的帮助,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一起来学matlab-matlab学习笔记5 低级文件输入输出函数

“参考书籍 《matlab 程序设计与综合应用》张德丰等著 感谢张老师书籍,让领略到matlab便捷 MATLABt提供了一组低级文件I/O函数,这些函数都是基于ANSI标准C库I/O....如果输入流是字节,而且fread到达了文件结尾,但是一个元素需要字节数才读了一半,这不足一个元素部分数据将被忽略。然而,如果输入流是位,则不足一个元素部分数据将被返回作为最后值。 ?...写二进制数据 fwrite函数用指定格式将矩阵元素写到文件,并返回已写元素数,其调用格式如下: ?...MATLAB利用文件指针确定下一个读或写操作开始地方法。如何知道文件指针是否在文件结束(EOF)?如何将指针移动到指定位置?怎样得知当前文件指针在什么地方?怎样重置指针在文件开头(BOF)?...fgets函数只用于文本文件。 tline=fgets(file1D,nchar):从fileID指定文件读一行文本,带有行结束符,返回行最多有nchar个字符。

1.3K30

fscanf读取一行字符串-C语言文件流(字节流) IO 操作(二) —— 初识“流”以及文件顺序读写(f

按照处理数据单位不同,可以分为字节流、字符流;按照数据流方向不同,可以分为输入流(从外设读取信息)、输出流(向外设输出信息)。   2、 为什么会有“流”概念?   ...当文件被关闭时候,指针指向位置会被重置。   (2) fputc 函数   fputc作用是向流或者标准输出(屏幕)中输出一个字符。.../ fputs) (1) fgets 函数   fgets 作用是从流或者标准输入(键盘)中获取多个字符。...fgets 函数声明如下:   第一个参数:存储读取到字符串   第二个参数:要读取字符个数   第三个参数:任意输入流,文件流或者标准输入流(即文件指针或者stdin)   返回值:读取成功则返回读取到字符串地址...你要写入到文件内容,需要先存到这个数组里   第二个参数:数组一个元素所占字节大小   第三个参数:数组大小   第四个参数:文件流指针   返回值:返回实际写入元素个数   注意:也可以写入一个变量或者一个自定义类型对象

1.2K30

线性表--顺序队列 循环队列 端队列(十三)

进行插入操作端称为队尾,进行删除操作端称为队头。队列中没有元素时,称为空队列。 2.队列数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。...与顺序栈相似,在队列顺序存储结构种,用一组地址连续存储单元依次存放从队头到队尾元素,如一维数组。 ? 由于队列中队头和队尾位置是实时变化,需要两个指针来随时跟随头尾队列。...,来说一下: 上面定义数组为50个单位,如果rear指针指向49,继续有数据入队,当rear指针+1变为49+1等于50,因为数组下标最大只有49,会造成数组越界并假溢出,此时便不应该是(rear...)49继续加1,而是应该将rear重置为0,才可解决问题,所以不采取取膜算法也是可以,就是将最大长度重置为0,而其他数和取不取模最后结果是一样,只是为了方便,一遍会采取取膜,(49+1)%=0,...而如果限定端队列从某个端点插入元素只能从该端点删除,则该端队列就蜕变为两个栈底相邻栈了。这种端队列看起来比栈和队列更灵活,但是实际应用中远不及栈和队列常用,就不在讨论。

74420

【PHP】文件写入和读取详解

【注意】:这里fgets()里第二个参数为10,为什么是10呢?因为 1.这里长度是按字节数算 2.一个汉字占3个字节。...将读取到全部内容保存到一个数组中,每个数组元素为一行内容——fille() <?...echo fgets($fp); //通过fgets输出一整行 print_file_pointer($fp);//打印此刻文件指针位置...所以我们需要正确理解fgets(),fpassthru()这些函数作用: fgets():从当前文件指针位置到本行结束数据,而不是一定输出一整行 fpassthru():从当前文件指针位置到全部内容结束数据...,而不是一定输出所有的数据 但在这里你可能会有疑问:为什么输出“湖湾”后指针位置会是17而不是15呢?

3.9K70

PHP中文件系统函数(三)

'r+' 读写方式打开,将文件指针指向文件头。 'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。...'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 'x' 创建并以写入方式打开,将文件指针指向文件头。...当使用最上方代码读取过一遍内容后,游标就已经到底了,这时候再次循环是无法读取文件内容,需要使用 rewind() 函数将游标进行重置。...fclose($f); fread() 函数读取内容中间为什么还会出现乱码呢?因为我们换行符还是按英文码只占一个字节呀!.../cn_test.txt', 'r+'); echo fgets($f), PHP_EOL; // 本无为野客,飘飘浪迹人间。

1.2K60

C字符串输入注意事项

gets()简单易用同时,也有着严重缺陷,同样拿上面那段代码来做说明,words数组长度限制为100个元素,每个元素是char类型字符,最后一个元素是空字符,所以实际上我们只能输入99个字符,...## fgets()函数 fgets()第一个参数是char str,也就是指针,指向chat类型,一般是存储字符串地址,第二个参数是读入字符最大数量,第三个则是FILE stream,指明要读入文件...因为fgets()限制了字符数量,所以避免了buffer overflow,另外,fgets()在输入不溢出情况下会将换行符也存储进去,所以配合fputs(),它会自动换行。...fgets()函数会返回指向char指针,顺利读取时返回地址与第一个相同,如果到了文件结尾,则会返回null pointer, 常见错误 未给字符串分配空间 对于下面一段代码, char *name...我们定义了指向char类型指针,然后它并没有进行初始化,name存储是指向哪里地址?他可能就随便存储了,而且内存并未为其分配空间。

1.1K10

【C】文件操作

打开文件 fopen 我们可以使用fopen()创建一个新或者打开一个文件, 文件信息会保存在一个FILE类型指针中, 该函数原型为: FILE *fopen( const char * filename...如下所示: "rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b" 文件成功打开会返回一个’FILE’类型指针, 如果打开失败, 会返回一个空指针...stdin) #define getc(__stream) fgetc(__stream) fgets 该函数原型为: char * fgets ( char * str, int num, FILE...读取完成后会在str后面追加上 终止null字符 (即\0), 这也是第一条为什么只读 num-1 个字符原因. 函数返回值是一个指向str指针....(c, 5, fp); printf("c is '%s'\n", c); printf("c length is %ld\n", strlen(c)); // 重置文件指针到文件开头

56310

【C】语言文件操作(一)

内容, 剩下内容将放到【C】语言文件操作 (二)中介绍 1.为什么使用文件 使用文件可以将数据直接存放在电脑硬盘上,使数据持久化。...fgets文本行输入函数 fgets fgets读取内容时会将终止符\0认为是其中内容,实际读取是num-1个元素,剩下一个为\0。...* stream ); 示例: //按照顺序读取文本行 // fgets //读到内容将被放到指针str指向字符数组中 //num要复制到str 最大字符数(包括终止空字符),真正读到字符是num...总结: fgets读取内容时会将终止符\0认为是其中内容,实际读取是num-1个元素,剩下一个为\0。 若文本中有换行,读取时会自动认为换行符\n是其中内容,并将其读取。 如何进行换行?...二进制输出函数 fwrite size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); void *ptr指针指向是要被写入数据元素

21020

C语言字符串IO

问题: 问题在于gets唯一参数就是数组名,它无法检查数组是否装得下输入行,数组名会被转换成该数组元素地址,因此gets函数只知道数组开始处,如果输入字符串过长,会导致缓冲区溢出,及多余字符超出了指定内存空间...fgets函数返回指向char指针,如果一切顺利,该函数返回地址与传入第一个参数相同,但是如果函数读到文件结尾,它将返回一个特殊指针:空指针。...PS:注意区分空字符和空指针(详见CPrimerPlus P335) 空字符是整数类型,但是空指针指针类型。 两者容易混淆原因是:它们都可以用数值0表示,但是,从概念上看,两者是不同类型0。...空字符是一个字符,占1个字节;而空指针是一个地址,通常占4字节。 gets_s()函数 C11新增gets_s函数和fgets函数类型,用一个参数限制读入字符数。...如果字符串中出现了换行符,那就用空字符替换它,如果字符串中出现了空字符,那就丢弃该输入行中其余字符,然后返回与fgets()相同值。 为什么要丢弃过长输入中余下字符?

4.5K10

C语言常用字符串函数及案例

fgets()第一个参数跟gets函数一样,也是表示储存输入位置地址(char*类型),第二个参数是一个整数,表示待输入字符串大小,最后一个参数是文件指针,指定读取文件。...由于 C 语言中数组第一个元素位置编号是 0, 所以最终输出加上 1, 即为字符位置编号.其中p是一个字符指针,指向包含元音字母位置;str是一个字符数组,代表要搜索字符串。...5 因为数组名代表整个数组地址,数组元素地址就是数组地址,数组名代表是数组元素地址。...因此,int *p = a; 将p指向了a数组元素地址,int *q = &a[5]; 将q指向了a数组第6个元素地址。...q-p等于第6个元素地址减去第一个元素地址,也就是第6个元素在数组中下标减去第一个元素在数组中下标,得到结果是5,因此输出结果为5。

81010

php各种 IO流 以及用法

php://协议 首先,我们来说一下一个php提供协议:"php://" 或许有人看到这个会懵逼,这是什么东东?这有啥用?这咋用?是谁?在哪?要去往何处?...",'r'); $data = fgets($stdin); echo "{$data}大哥,你好啊!"...php://stdin,也是关闭复制,STDIN已打开不会被关闭 2:php://stdin是只读 3:请直接使用STDIN常量,而不使用php://stdin 4:使用fgets读取,只能读取一行数据...temp数据\n"); rewind($temp_f);//由于写入数据时,指针已经到了末尾,需要重置指针才能读取到数据 echo stream_get_contents($temp_f); $fiveMBs...memory数据\n\n"); rewind($memory_f);//由于写入数据时,指针已经到了末尾,需要重置指针才能读取到数据 echo stream_get_contents($memory_f

1.3K21

C Primer Plus(七)

用双引号括起来内容被视为指向该字符串储存位置指针。这类似于把数组名作为指向该数组位置指针。...为了容纳空字符,在指定数组大小时,要确保数组元素个数至少比字符串长度多 1。所有未被使用元素都被自动初始化为 0(即空字符,不是数字字符 0)。 通常,让编译器确定数组大小很方便。..."; 数组形式和指针形式有何不同?以上面的声明为例,数组形式(ar1[])在计算机内存中分配为一个内含 29 个元素数组(每个元素对应一个字符,还加上一个末尾空字符’\0’)。...可以进行类似 ar1+1 这样操作,标识数组下一个元素。但是不允许进行 ++ar1 这样操作。 指针形式(*pt1)也使得编译器为字符串在静态存储区预留 29 个元素空间。...fgets() 函数第 2 个参数指明了读入字符最大数量。如果该参数值是 n,那么 fgets() 将读入 n-1 个字符,或者读到遇到第一个换行符为止。

63910

PHP在CTF中应用场景

元素数 htmlspecialchars() 函数把特殊字符转换为 HTML 实体 (通过 PHP trim() 函数)去除用户输入数据中不必要字符(多余空格、制表符、换行) (通过 PHP stripslashes...),并且脚本会继续 readfile()读取文件并输出文字 fopen()fclose()fwrite() fread() 第一个参数包含待读取文件文件名,第二个参数规定待读取最大字节数 fgets...文件指针在文件开头开始。w打开文件为只写。删除文件内容或创建一个新文件,如果它不存在。文件指针在文件开头开始。a打开文件为只写。文件中现有数据会被保留。文件指针在文件结尾开始。...创建新文件,如果文件不存在。x创建新文件为只写。返回 FALSE 和错误,如果文件已存在。r+打开文件为读/写、文件指针在文件开头开始。w+打开文件为读/写。删除文件内容或创建新文件,如果它不存在。.../都过滤掉,可写为....// ..//md5($$a)===md5($b) $a!

9210
领券