生成库文件||关闭终端显示与缓冲区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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值