C/C++输出输出相关问题

C/C++输出输出相关问题

  1. scanf(“%d”),如果缓存区的开始是数字,scanf会读入,直到遇见非数字字符,否则远不会读入

    #include
    using namespace std;
    int main() {
        int a[100];
        char c[100];
        // scanf的返回值为“所输入的数据与格式字符串中匹配次数.”
    	//简单来说就是,它返回已成功赋值的数据项数;出错时则返回EOF.
    	//(注:EOF(End Of File)是一个预定义的常量,等于-1.)
        for (int i = 0; i < 5; ++i) {	
            //一次输入1a2b3c4d5e,scanf(%d)只有一开始遇见数字才能把数字读走,%d会读入数字,直到遇见字符a停止
            cout<<scanf("%d", &a[i]) //如果在下一读入数字前,缓冲区最开始依然不是数字就永远不会读入之后的数字
           // c[i] = getchar();		//通过注释或解注释此语句,通过调试看数组a和c里面的内容,即可得证
        }
        return 0;
    }
    
    
    #include
    using namespace std;
    int main()
    {
    	int a;				
    	scanf("%d", &a);	//输入“*5”
    	char b = getchar();   //b='*'
    	char c = getchar();	  //c='5'	//a不变
    	return 0;
    }
    
  2. scanf(“%d\n”)多余输入问题及\n的读入问题,详细可看链接的另一篇博客。简单提要:
    1)空白符:指空格符、制表符、回车符;
    2)\n(回车)是被当作输入结束命令启动对应变量接收数据,但并不会把\n读走,只是检测。
    3)除了scanf(“%c”),scanf有一个特性——忽略先导的空白符,只要他们连续的出现在缓冲区的开头,不管有多少个连续的空白符,scanf都会把其读走并丢弃,直到遇到非空白符,再读入有意义的字符;
    4)读取字符串(字符数组)的时候,比如读aaa\n,你读入字符串最后会带有\n,这个\n并不是你输入的\n,而是编译器自己添加的,你自己输入的\n还留在缓冲区中。

  3. 在C++中,使用std::cin从用户那接收输入时,如果用户直接按下回车键而没有输入任何内容,也就是提交了一个空字符串,那么std::cin就会等待,直到用户输入有效的数据。也就是说,空字符串会被看做是无效的输入。此时就需要使用std::getline函数。这个函数会读取包含空白字符甚至什么都没有的输入,直到用户按下回车键,例如:

    #include 
    #include 
    
    int main() {
        std::string str;
        std::getline(std::cin, str);
        if(str.empty()) {
            std::cout << "The string is empty" << std::endl;
        } else {
            std::cout << "The string is " << str << std::endl;
        }
        return 0;
    }
    
  4. 上面第二条第2)点提到,\n当做输入结束标志,用于检测,并不会把其读走。所以在使用std::getline时要注意缓存区里的\n,可以使用getchar()读走\n,以便于std::getline读一行。
    getchar是C/C++中的一个标准库函数,用于从标准输入(通常是键盘)读取一个字符,并返回读取的字符,如果读取失败或到达了文件尾,就返回EOF常量。

你可能感兴趣的:(C++,c语言,c++,开发语言)