生成库文件||关闭终端显示与缓冲区stdin

字符串的整体输入有两个函数
①gets:直接传入字符数组
②scanf:(不读空格)
③最稳妥的字符串输入方式:fgets:
1.char * str
2.int size最多接收size字节
3.FILE* fp一个指向文件的指针
所以所有输入的内容是从fp指向的文件输入的
那么,终端作为一个文件,表述方式为stdin,stdout
fgets(str,10,stdin);
#include <string.h>
int getstring(char* str,int size){
fgets(str,size,stdin);
int len = strlen(str);
if(str[len-1] == ‘\n’){
str[len-1] = ‘\0’;
}
return len;
}
但是有一个严重的问题:如果输入内容长度超过数组容量,那么多出来的部分属于严重越界,程序崩溃。
把头文件放入系统中:
sudo cp usr.h /usr/include/
生成库文件:
gcc -c getstring.c -o getstring.o
ar crv libusr.a -o getsring.o(把有功能的函数添加入库)
把库文件放入系统:
sudo cp libusr.a /usr/lib

如果,在字符或者字符串输入的时候对输入的内容有要求:比如在输入密码的时候只能输入英文和数字,其他任何字符不能接收,这个时候就牵扯到了字符输入的合法性问题。
那么如何解决字符输入的合法性问题:
还是以输入密码为例:
①键盘依旧随意输入;
②如果输入的是英文或数字则将之显示在终端上。如果不是则不显示在终端上;
③如果输入合法,将合法的字符保存进入字符数组;
④最终将字符数组中的所有内容确定并输出。
怎么做呢:
输入的内容合法才显示,不合法不显示;
关闭终端显示可以做到不显示输出内容,在不显示的时候可以判断下输入的内容是否合法,不合法则不输出。
在这个过程中有两个问题:
1.关闭终端的显示
2.如何做到输入一个字符就判断是否合法而不需要等输入回车之后再判断。
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <assert.h>
#include <string.h>

char getch(){
char c = 0;
struct termios org_opts;
struct termios new_opts;
int res = 0;
res=tcgetattr(STDIN_FILENO,&org_opts);
assert(res == 0);
memcpy(&new_opts, &org_opts, sizeof(org_opts));
new_opts.c_lflag &=~(ICANON (缓存)| ECHO(终端显示) |ECHOE | ECHOK | ECHONL | ECHOPRT |ECHOKE | ICRNL);
tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);
c = getchar();
res = tcsetattr(STDIN_FILENO,TCSANOW, &org_opts);
assert(res == 0);
return c;
}

//只显示合法输入(字母与数字)并输出

#include <stdio.h>
#include <stdlib.h>
#include <usr.h>

int main(){
char ch = 0;
char str[255] = {0};
int i = 0;
while(1){
ch = getch();
if((ch >= ‘0’ && ch <= ‘9’)||(ch >=‘a’ && ch <= ‘z’)||(ch >=‘A’ && ch <= ‘Z’)){
printf("%c",ch);
str[i++] = ch;
}
if(ch == 10){
printf("\n");
break;
}
}
printf("%s\n",str);
return 0;

<think>好的,我需要回答用户关于文件描述符的定义及作用的问题。首先,根据用户提供的引用[1],文件描述符在Unix/Linux系统中用于标识进程访问的文件,是一个非负整数。我应该先明确这点作为定义的核心。 接下来,作用方面,引用[1]提到所有I/O操作都通过文件描述符完成,所以需要说明它是系统文件交互的桥梁。此外,用户提供的代码示例展示了如何通过C语言获取文件描述符,可以提到fileno函数的作用,但可能不需要深入代码细节,除非用户明确要求。 还要考虑文件描述符的常见用途,比如标准输入、输出、错误对应的0、1、2,这点虽然引用中没有提到,但属于基础知识,可以补充以丰富回答。另外,可能需要提到文件描述符文件指针的区别,比如FILE结构体和fd的关系,这里引用中的代码正好用到了fileno,可以自然地引用[^1]。 用户可能还关心文件描述符的管理,比如打开、关闭(close函数)以及资源限制,如最大数量等。引用[1]提到了close函数的工作原理,可以简要提及,但重点应放在定义和作用上。 需要确保回答结构清晰,分点或分段说明定义、作用、常见场景,并引用相关参考资料。同时,生成的问题应围绕扩展知识点,如文件指针的区别、管理函数、标准描述符等,引导用户进一步学习。 最后检查是否符合系统指令:使用正确的中文,LaTeX格式(如果有数学表达式的话,但本题可能不需要),引用标识正确。例如,在提到文件描述符是系统级资源时,引用[^1];在提到close函数时,同样引用[^1]。 现在组织语言,确保自然流畅,不使用Markdown,段落间用换行分隔。用户的问题比较基础,所以回答要简洁明了,避免过于技术化,同时覆盖关键点。</think>### 文件描述符的定义及作用 **定义** 文件描述符(File Descriptor, FD)是操作系统(如Unix/Linux)中用于标识进程访问的输入/输出资源(如文件、管道、网络套接字等)的非负整数。它本质上是一个索引值,指向内核维护的“打开文件表”中的条目,该条目记录了文件的实际信息(如读写位置、访问模式等)。 **核心作用** 1. **统一抽象接口** 文件描述符将不同类型的I/O资源(文件、设备、网络等)抽象为统一的接口。程序通过FD即可操作这些资源,无需关注底层差异。 例如:`read(fd, buffer, size)` 和 `write(fd, buffer, size)` 函数通过FD完成读写操作。 2. **资源访问控制** 每个进程独立维护自己的文件描述符表,确保进程间资源隔离。例如,两个进程打开同一文件时,它们的FD可能指向不同的内核条目。 3. **标准输入/输出/错误** 系统预定义三个标准FD: - `0`:标准输入(stdin) - `1`:标准输出(stdout) - `2`:标准错误(stderr) 这使得程序可以默认从终端读取输入或输出结果。 **典型场景** - 打开文件时,系统返回一个FD(如`open("file.txt", O_RDONLY)`返回`3`)。 - 网络编程中,套接字(socket)也通过FD标识,如`int sockfd = socket(...)`。 - 调用`fileno(FILE *stream)`可将C语言的文件指针(如`FILE*`)转换为FD[^1]。 **文件指针的区别** 文件指针(如`FILE*`)是C标准库的抽象层,封装了FD及缓冲区管理。FD则是更底层的系统资源,直接内核交互[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值