【C++】IO学习小记

1、Scanf函数

  1. Scanf是C语言中的一个输出函数,与printf函数一样,被声明在头文件stdio.h里,使用scanf函数时要加上#include <stdio.h>
  2. int scanf( format string , arg1 , arg2 , …); 返回按指定格式正确接收输入变量的个数 或 "文件结尾“”则返回EOF
  3. Scanf函数以空格、回车、Tab键作为结束标志;接受字符串自动在后面加‘\0’,且空格、回车、Tab键留在缓冲区
int main()
{
    int a,b;
    int value;
    value = scanf("%d,%d", &a, &b);     //键入1,2
    printf("%d", value);    			//value = 2,键入正确接收个数
    
	value = scanf("%d,%d", &a, &b);     //键入1,ada
    printf("%d,%d,%d", value,a,b);      //value=1,a=1, b错误键入

    system("pause");
    return 0;
}
  1. Scanf使用起来并不是很友好,比如在不同的编译环境中,他们得到的结果数值是不一样的,可移植性并不是很优秀
  2. Scanf的缓冲区问题
    https://blog.csdn.net/qq_38646470/article/details/80936905
    https://www.cnblogs.com/yhjoker/p/7530837.html
int main()
{
    int a,b;
    int value;
    char c;
    value = scanf("%d%d", &a, &b);       //键入12 a后回车\n
    scanf("%c", &c);
    printf("%d,%d,%d,%c", value,a,b,c);  //a = 12, b无穷大值(不正确接收) ,c = a

    scanf("%d%d", &a, &b);               //键入12,4后回车\n
    scanf("%c", &c);                     //假设目标键入t
    printf("%d %d %c", a,b,c);           //a=12, b=4, c=\n
    system("pause");
    return 0;
}

2、gets函数

  1. *char gets(char str); 参数类型为 char 型,即 str 可以是一个字符指针变量名,也可以是一个字符数组名
  2. gets 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间,;以回车作为结束标志
  3. 注意:接收完成字符串后自动添加‘\0’,但不同在于它是将‘\n’变为’\0’,所以此时’\n’不会留在缓冲区中
int main(void){
    char a1[10];
    gets(a1);           //键入asdfghjklq
    char c = getchar(); //键入a
    puts(a1);
    printf("%c\n", c);  //c=a,并不会接收到‘\n’,这是英文gets的结束机制特点
    return 0;
}

3、getchar函数

  1. getchar()函数只能接收一个字符,其函数值就是从输入设备获取到的字符
  2. getchar有一个int型的返回值(返回值是用户输入的字符的ASCII码).当程序调用getchar时.程序就等着用户按键
  3. 用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).回车符也是字符
  4. 当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。若文件结尾则返回-1(EOF),且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键
  5. 那么如何解决4中出现的这种问题呢?
//方法1,多添加一个getchar()函数用作清除\n
char a,b,c;
a = getchar();  //键入f\n
b = getchar();  //a=f,b=\n,所以此时\n就被从缓冲区清除出来了,但也有问题,当输入了多个字符就不行了

//方法2,fflush(stdin);清除输入缓冲区
a = getchar();  //键入f\n
fflush(stdin);  //C语言的清空缓存区函数

//方法3,C++提供的rewind()函数; void rewind( FILE* stream );
a = getchar();  //键入f\n
rewind(stdin)

//方法4,添加下面语句
a = getchar();  //键入f\n
while(getchar()!='\n'&& getchar() != EOF); 

4、putchar函数

  1. 函数putchar()用于将给定的字符输出到控制台; int putchar (int ch);ch为要输出的字符;输出成功,返回该字符的ASCII码值,否则返回EOF
#include <stdio.h>

int main ()
{
   char ch;
   for(ch = 'A' ; ch <= 'Z' ; ch++) {
      putchar(ch);
   }
   return(0);
}

5、Scanf_s函数

  1. scanf_s()函数是VS开发工具提供的一个功能相同的安全标准输入函数,在调用该函数时,必须提供一个数字以表明最多读取多少位字符。另外,很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。比如:char d[20];写成scanf_s("%s",d,20);才是正确的,有这个参数20使准确性提高
  2. 函数int scanf_s( const char *format [, argument]...); 函数返回一个整型,该整型值就是scanf_s()函数所输入的个数,与scanf相同
int    i,b;
int result;//函数返回值
scanf_s("%d ", &i);
scanf_s("%d %d", &i, &b);
result=scanf_s("%d %d", &i, &b);//运行结果为2,因为输入了两个数,一个a,一个b

char     c,  s[80];
scanf_s("%c %s ,  &c, 1,s,80);   //字符c输入1个,c后面跟1,s字符数组80个,所以s后面加80。

5、cin函数

1. cin概述
cin 是 C++ 的标准输入流对象,即 istream 类的对象。cin 主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout 是输出流对象,即 ostream 类的对象,cerr 是标准错误输出流的对象,也是 ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。

2. cin原理
当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符(\n),这个换行符也会被存储在 cin 的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了 123 这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是 4 ,而不是 3。cin 读取数据也是从缓冲区中获取数据,缓冲区为空时,cin 的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发 cin 的成员函数去读取数据。

3. cin读取数据
cin 可以连续从键盘读取想要的数据,以空格、tab 或换行作为结束标志。当 cin 从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin不做处理。因此在与while使用是,容易造成阻塞。

void main()
{
    char s;
    int a;
    char b;
    cin >> s >> a >> b;
    int c = cin.get();
    cout << s << " " << a << " " << b << " " << c<<"end";
    # LF (NL line feed, new line)	换行键  ASCII码 十进制 10
    system("pause");
}



1
2
3
1 2 3 10end请按任意键继续. . .
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值