bilibili课程:C C++就业班视频C#/C++全栈高级开发工程师 就业班(完结)_哔哩哔哩_bilibili
putchar( ) 和getchar ( ), fputchar()和 fgetchar |
putc( ) 和 getc( ), fputc( ) 和 fgetc( ) |
puts( ) 和gets () ,fputs ( )和 fgets ( ) |
printf( ) 和 sprintf( ) ,fprintf ( ) |
scanf( ) 和sscanf( ), fscanf( ) |
int putchar (int char)
作用:向屏幕输出一个字符。
返回值:一个无符号整数,代表这个char的ASCII码。
putchar('A');
putchar('\n');
还可以输入一个0-128之间的整数,因为char 可以看做一个字节长度的无符号整数。
putchar((char)120);//x
putchar((char)50);//2
int getchar (void )
返回值:自定义的字符(的ASCII码)。
作用1:从缓冲区读取一个字符。如果缓冲区没东西,那么提取用户从键盘新输入的1个字符。
char ch;
ch=getchar();
printf("%c",ch);
用户输入 F 然后敲回车,程序打印字母F (后面没有回车),然后程序结束。
但是这时候,回车仍然存入缓冲区。再次getchar( )也可以拿到这个回车。
作用2:清除缓冲区的回车。
char ch;
ch=getchar();
printf("%c",ch);
printf("%c",getchar());
敲一个字母G ,敲回车,打印两次,会把回车输出:
利用getchar( )清除缓冲区回车的例子:
系统生成随机数,用户输入一个数字进行比对,如果猜错了用户自己选择是否继续。但是敲数字末尾一定回敲一个回车,这个回车代替了用户输入的Y 或者N。解决办法是把回车空格都取干净
srand(time(NULL));//头文件
int r_num=rand()%101+1; //1-100
int a;
while(1){
printf("请输入数字\n");
scanf("%d",&a);
while(getchar()!='\n'){
continue;
}//这个while必须有
if(a==r_num){
printf("猜对了");
}
else{
printf("猜错了,是否继续, Y N\n");
char n;
scanf("%c",&n);
if(n=='N'){
printf("输入的字符是%c,表示您拒绝继续\n",n);
break;
}
}
}
参考博客 C语言函数大全--f开头的函数(下)_c语言floorf_Huazie的博客-CSDN博客
int fputchar (char ch );
送一个字符到标准输出流(stdout)中,出错则返回EOF
30.2 演示示例
#include
int main(void)
{
char msg[] = "This is a test";
int i = 0;
while (msg[i])
{
fputchar(msg[i]);
i++;
}
return 0;
}
————————————————
版权声明:本文为CSDN博主「Huazie」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012855229/article/details/129890599
int fgetchar(void);
从用户键盘获取一个字符。 用户最后敲的回车仍然被留在缓冲区中。。
char ch2;
ch2=fgetchar();
printf("%c",ch2);
等同于fputc( ) 但是既可以做函数也可以做宏。fputc( )只能作为函数实现。其他作用,语法,都相同。
等同于fgetc( ) 但是既可以做函数也可以做宏。fputc( )只能作为函数实现。其他作用,语法,都相同。
还是有区别的,不带f 的,只能用于标准输入输出流(键盘,屏幕) 带f 的可以用于所有流
int fputc ( int c, FILE * stream )
向文件指针stream代表的文件中,写入一个字符,这个字符对应的整数是c 。
返回值:成功:该字符对应的ASCII码
失败:-1
int fgetc ( FILE* stream)
作用:从文件指针stream代表的文件中,读取一个字符。
返回值:成功:读到的字符对应的ASCII码
失败:-1
文件到达结尾的判断条件:EOF 也就是返回-1
以EOF作为结束标志的文件,必须是文本文件
因为二进制里会出现-1 。fputc 往文件里放-1 (这个操作最好别弄)就把文件当二进制文件了
注意:二进制文件使用 feof (FILE * fp) 函数来判断。返回值不是0,到达。返回值0,表示没到文件结尾。
char ch;
FILE *fp=fopen("csdn.txt","r");
while( (ch=fgetc(fp)) !=EOF ){
printf("%c ",ch);
}
//事先在本cpp同一个文件夹下
//创建了csdn.txt并且往里面写了一些大写字母
int puts (const char* str)
作用:标准设备输出一个字符串str 。注意:输出完成后会自动在后面添加\n。
返回值:成功则返回非负整数(可以是0 )。失败返回-1.
puts("hello");
char* gets( char* s)
作用:从标准输入读入字符,并保存到s 指定的空间,直到出现换行符或者读到文件结尾。
返回值:成功:读入的字符串。(??我认为是首地址? char s[ ] = "abc" 返回的是s)
失败:NULL
gets( ) 和scanf ( ) 的两点区别:
1.gets( )允许用户输入的字符串中含有空格,也会保留下来。
scanf遇到空格就不管后面的了,自动停止。
2. gets( )会把用户最后敲的回车,从缓冲区里扔掉。但是scanf( )会吧这个回车保留在缓冲区。
因此,如果你刚用了scanf( ) ,后面又要获取用户键盘输入,需要先
while (getchar ( ) != '\n' ) 清除缓冲区内的回车。
int dig;
printf("请输入的值\n");
scanf("%d",&dig);
printf("您输入的数字是%d\n",dig);
// getchar(); //重要 不能注释掉
char ch;
printf("请输入一个字符\n");
scanf("%c",&ch);
printf("您输入的字符是%c\n",ch);
中间那句getchar( )必须要有,不然还没等输入一个字母'A ' ,程序就执行完了,第二次打印的是一个换行符。
char str[10];
gets(str);
printf("%s",str);
//输入ABC DEF 会打印出ABC DEF后面没回车
注意:和scanf( )一样,都是不安全的,因为长度超出了规定长度,也不报错,会造成字符数组越界(缓冲区溢出)。
int fputs (const char* __restrcit_Str, FILE *stream )
作用:向文件指针stream代表的文件中,写入字符串__restrcit_Str,字符串结束符号'\0'不写入文件中。(文件应当先执行打开操作)
参数2也可以是标准输出 (屏幕),此时类似于printf( ), 向屏幕打印字符串Str 。参数2写作 stdout 。
返回值:成功:0 。失败:-1.
fputs ( ) 不会在字符串末尾添加回车。 puts ( )向屏幕打印字符串会在后面自动加回车。
char* fgets ( char* __restrict_Buf, int Size, FILE *stream )
返回值:成功:读到的Buf 。失败:NULL。
3.4.1 作用一:从文件指针steam代表的文件中,读入数据,保存到_Buf指定的内存空间,直到出现换行字符、读到文件结尾或者已经获取了 Size-1 个字符为止。然后自动在末尾添加' \0' (字符串终止符) 。
注意,字符串总长度是Size,最后一个是字符是'\ 0 ' 也计算进长度了。所以看起来长度是size -1
3.4.2 作用2:第三个参数也可以是stdin 标准输入(键盘),此时类似于scanf ( ), 从键盘获取用户敲入的字符串
char str3[30];
fgets(str3,6,stdin);
printf("%s",str3);
//敲ABCDEFG回车 str3打印输出是ABCDE
//敲ABC回车(长度不够6) str3打印输出是ABC回车
记住!!当长度不够时,fgets( )会保留用户敲入的回车!
fgets ( )比 gets ( ) 更安全的获取用户输入
int printf ( const char* _restrict_format, ...)
作用:向屏幕输出按照一定格式编写的字符串。
形参列表里的...表示这是一个变参函数。最后一个固定参数(这里是format)通常是格式描述串,包含格式匹配符。函数参数的个数、类型、顺序由这个固定参数决定。
printf("hello world\n");//1个参数
int a =40;
printf("%d",a);// 2个参数
printf("%d+%d=%d",10,20,30);//4个参数
int sprintf (const char* __restrict _Dest, const char* Format, ...)
作用: 向目标字符串Dest中写入按照一定格式编写的字符串,不再向屏幕输出。
...表示参数的个数和类型取决于format。
char str2[15]={0};
sprintf(str2,"%d年%d月%d日",2023,6,3);
printf("%s",str2); //2023年6年3日
int fprintf ( FILE* stream, const char* _Format, ...)
功能:按照一定的格式(Format规定的)转换并格式化数据,然后将结果写入文件指针stream代表的文件中,指定出现字符串结束符 '\0'为止。
返回值:成功:实际写入文件的字符个数。
失败:-1
例子:向文本文件中,写入10个随机数字。
void write_ran(){
FILE *fp6=fopen("rand.txt","w");
if(!fp6){
perror("出错了 没文件");
}
srand(time(0));
//fprintf别忘了回车!!!
for(int i=0;i<10;i++){
int a=rand()%70+30;
fprintf(fp6,"%d\n",a);
}
fclose(fp6);
}
inline int scanf( const char* __ristrct_Format, ...)
作用:获取用户从键盘输入的数据,并与格式化字符串Format进行比对,将数据存入变量中。
scanf 不允许用户输入空格;碰到空格就提前结束。
int arr[4];
for(int i=0;i<4;i++){
printf("请输入数组元素的值\n");
scanf("%d",&arr[i]);
}
for(int i=0;i<4;i++){
printf("%d ",arr[i]);
}
scanf ( )和gets ( )都是不安全的键盘输入获取方式,因为它们会一直读取到用户敲入回车(换行)或文件结束,容易越界。
int sscanf ( const char* __restrict__Src, const char* __restrict_Format, ...)
把参数1 Src字符串当做源头,从中获取数据,并与格式化字符串Format进行比对,存入...代表的变量中。
返回值:成功:参数数目,成功转换的值的个数
失败: -1
char str3[50]="year:2023-month:6-day:3";
int y,m,d;
sscanf(str3,"year:%d-month:%d-day:%d",&y,&m,&d);
printf("%d-%d-%d",y,m,d);//2023-6-3
int fscanf( FILE* stream , const char* format, ...)
作用:从文件指针stream代表的文件中,按照format格式字符串规定的格式,读取数据,存入...包含的参数中。
返回值: 成功:正确匹配的个数。
失败:-1。
注意事项:(1) 用于存储数据的空间,在使用之前应当清空。比如,要将文本中10个整数读出来,存进array[10] 数组中,array这个数组不能有数据。
(2)fscanf()函数在每一次调用时,都会自动判断下一次调用是否匹配参数2 format规定的格式。如果不匹配,提取结束文件,feof ( FILE* stream )为真。
例子:之前写入文件 “rand.txt” 的10个随机数,再以整数的形式fcanf 扫描提取到一个新数组中,保存起来。 注意利用fprintf 写文件的时候,用的什么格式,fscanf 读取的时候,格式字符串保持一致!别忘了换行符这种细节。 \n
void read_ran(){
FILE *fp77=fopen("rand.txt","r");
if(!fp77){
perror("出错了 没文件");
}
int array[10];
int i=0;
while(1){
fscanf(fp77,"%d\n",&array[i]);
//注意!!如果fscanf第二个参数没有回车符号,最后一个数字将不匹配。
//然后最后一个数字打印两次。
printf("%d\n",array[i]);
i++;
if(feof(fp77)){
break;
}
}
fclose(fp77);
}