如何快速获取数组最后元素及fgets读取字符串的末尾字符?
嘿,这两个问题我之前写C代码时都踩过坑,来给你详细捋捋~
问题1:是否存在快速获取数组中最后存入元素的方法?
实话说,C语言里没有像Java那种直接返回最后元素的内置方法,但有个高效的替代方案——你得自己维护一个计数器。
比如你定义了数组int arr[10];,再声明一个int count = 0;,每次往数组里存元素时,把元素放到arr[count],然后count++。这样要拿最后存入的元素,直接取arr[count-1]就行,完全不用遍历,这是最快的方式。
为啥不能直接用数组长度?因为数组是预分配好空间的,未存入元素的位置都是垃圾值,你根本不知道哪一个是最后真正存进去的。所以计数器是C语言处理这类场景的常规操作。
问题2:获取fgets读取行的最后一个有效字符
你说的没错,sizeof(line)永远是数组的总大小,跟实际存了多少字符没关系,靠它肯定不行。不过不用自己遍历,用标准库的strlen()就能搞定,而且效率比自己写遍历高(毕竟标准库实现都是优化过的)。
核心思路是这样的:
fgets()读取的字符串会以\0结尾,如果输入的行没超过数组大小,还会把换行符\n也存进去;如果输入太长,数组装不下,fgets()会截断内容,最后只加\0。- 用
strlen()拿到字符串的实际长度(不包括\0),然后判断最后一个字符是不是\n:- 如果是,说明这是完整的一行输入,最后一个有效字符就是
\n的前一位; - 如果不是,说明输入被截断了,数组最后一个字符就是有效字符;
- 还要特殊处理空行的情况(只按了回车),这时候字符串只有
\n和\0,没有有效字符。
- 如果是,说明这是完整的一行输入,最后一个有效字符就是
给你写个适配你代码的示例:
#include <stdio.h> #include <string.h> int main() { char command[6]; // 先判断fgets是否读取成功 if (fgets(command, 6, stdin) != NULL) { size_t len = strlen(command); if (len == 1) { // 只有换行符,说明是空输入 printf("你输入的是空行哦,没有有效字符\n"); } else { char last_valid; if (command[len - 1] == '\n') { // 完整读取了一行,取换行前的字符 last_valid = command[len - 2]; } else { // 输入太长被截断,取最后一个字符 last_valid = command[len - 1]; } printf("最后一个有效字符是:%c\n", last_valid); } } else { printf("读取输入失败啦\n"); } return 0; }
比如你输入1stLine到char line[10]中,fgets会完整读取1stLine\n\0,此时strlen(line)为8,len-2等于6,对应字符就是'e',完全符合你的需求。
内容的提问来源于stack exchange,提问作者wattbatt
相关产品推荐
相关产品推荐

