C语言的输入:

1. getchar()

int getchar(void);  是 <stdio.h> 中的库函数,作用是从 stdin 流中读入一个字符,返回对应的 ASCII 码,因此回车、空格等也能读取。

EOF -- end of file 文件结束符标志,键盘上用 Ctrl + Z 实现。

常用方法:从输入流读取的一个字符赋值给 ch,并判断是否为回车结束,或是否为 EOF

#include <stdio.h>

int main(){
    char ch;
    while((ch = getchar()) != '\n' && ch != EOF){    
// 从输入流读取的一个字符赋值给ch,并判断是否为回车结束,或是否为 EOF(文件读入结束符)
        ...
    }
}

2. scanf(...)

int scanf( const char *format [,argument]... );

  1. scanf是一个变参函数。(参数的数量和类型不确定)
  2. scanf的第一个参数是需要输入的字符串格式以及需要被读取的占位符
  3. scanf的后续参数,是依次被读取并赋值的变量地址
  4. 占位符的类型和数量需要与后续的参数类型和数量对应。

scanf 返回成功匹配的数据项数,失败则返回 EOF。

格式化字符串包括三类数据:
(1)格式化说明符;
(2)空白符(空格‘ ’、回车‘\n’、退格'\t'等);
(3)非空白符。

按格式输入,配套的格式符有:

对于 scnf 函数,'\n' 会触发 scanf 读取输入缓冲区的内容,遇下面情况时表示该数据结束:
   (1) 遇 空格 或 回车 或 跳格(tab)
      【scanf("%c", &ch) 能读到ASCII码对应的字符,包括空格/换行/跳格/转义符等】
   (2) 按指定的宽度结束. 如3列的%3d
   (3) 非法输入

对于格式化的字符串,在键盘输入时数据的顺序也要一一对应,否则出错返回,

scanf("%d,%d %c-%f", &a, &b, &ch, &f);    // 输入:12,3 a-2.5
#include<stdio.h>
#include<string.h>
 
int main()
{
    char ch[100];
    scanf("%s", &ch);       // abc回车
    printf("%s", ch);       // abc
    char ch0 = getchar();   // 读取到scanf时的回车
    printf("%c", ch0);      // 回车
    return 0;               
}

abc
abc
请按任意键继续...

在 scanf 之后使用 getchar() 会读取到缓冲区中的 回车符,因此可以在 scanf 之后使用如下代码清空缓存区

getchar();    // 读取一个换行符

或

while ((ch = getchar() != '\n') && ch != EOF);    // 清空缓存区的回车

输入文件中的所有字符串,输入完则跳出:

while(scanf("%s", s) != EOF){    // 字符串之间空格或者回车隔开
    ...
}
  • 按输入格式输入,否则输入结束:
while(scanf("%d", d) == 1){    // 格式不匹配时退出循环
    ...
}

C语言 scanf 读取带有空格 / 回车的字符串

%[] 格式控制符,基本格式为:%[scanfset]

  1. 以非 “^” 字符开头的 scanset , 表示在读入字符串时将匹配所有在 scanfset 中出现的字符,遇到非 scanfset 中的字符时输入就结束
  2. 以 “^” 字符开头的 scanfset ,表示在读入字符串时将匹配所有不在scanfset 中出现的字符,遇到scanfset 中的字符输入就结束

%[^\n] : 以回车符结束,同时回车符停留在缓存区中,能够被 scanf("%c", &c); 读取到单个回车符。

#include <stdio.h>
#include <string.h>
int main()
{
    char str[1024];
    char c;             
    scanf("%[^\n]", str);   // abc空格cba回车
    printf("===print str:\n%s", str);      // abc空格cba
    scanf("%c", &c);        // scanf的回车
    printf("===print char:\n%c", c);        // 回车
    return 0;
}

abc cba
===print str:
abc cba===print char:

请按任意键继续. . .

%[^EOF] :以文件结束符标志 EOF ( 新行 Ctrl + Z) 结束

#include <stdio.h>
#include <string.h>
int main()
{
    char str[1024];
    char c;             
    scanf("%[^EOF]", str);   // abc空格cba回车
    printf("===print str:\n%s", str);      // abc空格cba
    scanf("%c", &c);        // scanf的回车
    printf("===print char:\n%c", c);        // 回车
    return 0;
}

abc cba..
abc
^Z
===print str:
abc cba..
abc
d
===print char:
d请按任意键继续. . .

C++ cin 和 getline 的使用

C++ 输入过程中,是把输入加载到缓冲区中,然后对缓冲区中的字符进行读取。

cin >> 流提取运算符根据它后面的变量类型读取数据,从非空白符号开始,遇到Enter、Space、Tab键时结束。

getline 函数从 istream 中读取一行数据,包括前导和嵌入的空格,当遇到“\n”时结束返回

在使用 getline 读入一整行时,
若是前面是使用getchar()、cin这类读入数据,但是不会读入后续换行 \n 符号或者空格的输入时,再接 getline() 就容易出现问题。

这是因为 cin 输入敲回车后,产生的换行符仍然滞留在输入流中,接着就被 getline(cin,s) 给读取并结束返回,此时s = “\n” ,所以实际上s只是读入了一个换行符 \n。

而若前面使用 getline(),再用 getline() 进行读入,此时不会发生问题。
因为 getline() 中读入结束的回车后,结束符不放入缓存区,会将读入的 \n 直接删除,下一个输入前,缓冲区为空,并不会因为回车留下\n。

所以当 cin>> 后使用 getline() 时,我们需要将输入流中的换行符进行手动清除,即调用cin.ignore(); 函数。

int main()
{
	string str;
	int n, m;
	cin >> n >> m;
	cin.ignore();
	getline(cin,str);
 
	cout << n << m << endl;
	cout << str << endl;
	
	system("pause");
	return 0;
}

C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐