• 【C语言】while((ch=getchar()!=EOF))相关问题详解(结束、安全)


    本篇文章主要介绍一下while((ch=getchar()!=EOF))相关问题
    ​​1️⃣​分别介绍getcharEOF
    ​2️⃣​​while(ch=getchar()!=EOF)while((ch=getchar())!=EOF)的区别
    ​3️⃣​while((ch=getchar())!=EOF)如何结束
    ​4️⃣​​int chchar ch的区别

    ​1️⃣​​分别介绍getcharEOF

    int getchar(void)
    使用键盘输入字符,字符输入缓冲区,然后getchar()函数获得的字符是从输入缓冲区中提取的且每次只能提取一个字符,只有点击回车Enter,计算机刷新缓冲区,将这个缓冲区的内容打印出来。

    示例:

    #include
    int main()
    {
    	char ch = getchar();//输入字符
    	putchar(ch);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    EOF 的全称是end of file 通常在文件结尾来表示结束标志,或者文件读写出现了错误会出现
    我们可以把EOF来当作-1来处理

    #include
    int main()
    {
    	printf("%d",EOF);//结果为-1
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2️⃣​​while(ch=getchar()!=EOF)while((ch=getchar())!=EOF)的区别

    从下面的两段代码可以看出虽然就只是差了一个括号,但是输出的差距还是很大的,
    这里的原因是因为!=的优先级要高于=,所以导致两段代码输出的差距。
    这里还有一点是键盘输入字符要进入缓冲区,只有按下Enter才能进行输出,回车也是进入了缓冲区,所以回一并打印出来。

    int main()
    {
    	int ch;
    	while (ch = getchar() != EOF)
    	{
    		putchar(ch);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    
    int main()
    {
    	int ch;
    	while (ch = getchar() != EOF)
    	{
    		putchar(ch);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    ​3️⃣​while((ch=getchar())!=EOF)如何结束

    输入EOF的方式是Ctrl+Z(在Linux系统下,利用快捷键Ctrl+D;在windows下用Ctrl+Z,然后在按下Enter就可以输入文件结束标志EOF了。 )可以理解成EOF=Ctrl+Z

    ​4️⃣​​int chchar ch的区别

    也就是下面这段代码中这两种情况,虽然两种情况绝大部分是没什么区别的,
    我个人理解是因为EOF当作-1,把负数放在字符类型是不正确的。
    在书中《C和指针》中是这样写的,EOF需要的位数比字符型值所能提供的位数要多,这也是getchar返回一个整形值而不是字符型的原因。然而,把getchar的返回值首先储存到ch中将导致它截断。然后这个被截断的字符提升为整型并与EOF进行比较。当这段存在错误的伪代码在使用在有符号字符集的机器运行时,如果读取了一个\377的字节,循环将会终止,因为这个值截断在提升之后与EOF相等。当这段代码在使用无符号字符集的机器上运行时,这个循环将永远不会终止!

    #include
    int main()
    {
    	int ch;
    	//char ch;
    	while ((ch = getchar()) != EOF)
    	{
    		putchar(ch);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    最后:文章有什么不对的地方或者有什么更好的写法欢迎大家在评论区指出
  • 相关阅读:
    数据结构与算法训练:第二十九弹
    视频孪生智慧水利的十大场景应用案例
    机械制图中焊接符号的标注规则
    Android 车载应用开发指南 - CAN Bus 协议详解
    【C++】C++11——lambda表达式
    力扣:125. 验证回文串(Python3)
    Qt编译MySQL数据库驱动
    css中页面元素隐藏
    springboot全局异常处理详解
    Java基于SSM的海淘商城系统
  • 原文地址:https://blog.csdn.net/m0_66599463/article/details/127592242