关于对getchar一些小小的自学理解。。。

本文介绍了一款使用C语言编写的简单程序,该程序能够从标准输入读取C源代码,并验证所有花括号是否正确成对出现。程序利用getchar()函数逐个字符读取,统计大括号数量并检查它们的配对情况。

小编今天写了一个小程序关于getchar()。。

题目:

编写一个程序,它从标准输入读取C源代码,并验证所有的花括号都正确的成对出现。 

题目什么意思呢?

意思就是让从键盘获取一段源代码判断代码中的大括号是否成对且相互匹配。

那么先说说getchar() 自己总结的一下。

getchar()最主要功能是从键盘上获取一个字符,但用法却很灵活也很有特点。

比如一般要获取多个字符的时候与while 结合,就会从键盘上一个一个获取。

通常是把输入的字符赋值给一个变量,也可以通过数组将获取的字符存入数组,就拿上面题目来说,代码如下:

#include<stdio.h>
int main()
{
	char c,s[100];
	int i = 0,n,ch,cha;
	int j = 0,z = 0;
	printf("请输入字符个数小于100\n");
	while((c=getchar())!='\n')//获取字符并计数‘{’ 和 ‘}’的个数
	{
		s[z] = c;
		if(c == '}')
		{
			i+=1;
		}
		if(c == '{')
		{
			j+=1;
		}
		z++;
	}
	s[z] = '\0';
	for(n=0; n<sizeof(s)/sizeof(s[0]); n++)//判断第一个大括号是‘}’还是‘{’。
	{
		if(s[n]=='}')
		{
			ch = -1;
			break;
		}
		if(s[n]=='{')
		{
			ch = 1;
			break;
		}
	}
	for(n=sizeof(s)/sizeof(s[0]); n>0; n--)//判断最后一个大括号是‘{’还是‘}’。
	{
		if(s[n]=='{')
		{
			cha = -1;
			break;
		}
		if(s[n]=='}')
		{
			cha = 1;
			break;
		}
	}
	if((ch==-1)||(cha==-1))//如果第一个大括号是‘}’或者最后一个大括号是‘{’,匹配错误。
	{
		printf("匹配失败\n");
	}
	else
	{
		if(i == j)//判断‘{’和‘}’的个数是否相等并且大括号为{}。
		{
			//if((ch==1)&&(cha==1))
			printf("匹配成功\n");
		}
		else 
		{
			printf("匹配失败\n");
		}
	}
	printf(" ‘{’ 有%d个, ‘}’ 有%d个\n",j,i);
	return 0;
}
对于s[z] = '\0'这个相信有人疑问,我是这样理解的,每个数组在内存中最后一个结束符为\0。所以这是对数组的长度的限制。

希望有帮助,或者请多多指教

<think>我们正在讨论`getchar()`函数对换行符`\n`的处理。根据引用内容,特别是引用[2]和引用[3],我们可以总结如下: 1. `getchar()`函数从标准输入缓冲区中读取一个字符。当用户在命令行输入一串字符并按回车键时,回车键实际上会产生一个换行符(在Unix-like系统中)或者回车换行(在Windows系统中,即`\r\n`,但输入流中会被转换为`\n`)。 2. 引用[2]提到:如果输入一个字符(例如&#39;a&#39;)然后按回车,那么第一次调用`getchar()`会读取字符&#39;a&#39;,而第二次调用`getchar()`会读取回车产生的换行符`\n`。 3. 引用[3]详细说明了回车和换行的区别,并指出在Windows系统中,按回车键产生的是`\r\n`,但输入流中会被转换为`\n`。因此,在程序中,我们只需要处理`\n`即可。 4. 引用[3]还提到,使用`scanf("\n")`来吸收换行符可能会失败,因为换行符在输入流中可能是由回车键转换而来的,而`scanf`的格式字符串中的`\n`会匹配任意数量的空白字符(包括0个),所以它可能不会按预期工作。因此,更可靠的方法是使用`getchar()`或`scanf("%c", &c)`来读取并丢弃换行符。 因此,`getchar()`对换行符`\n`的处理就是:它会将换行符当作一个普通字符读取。如果在输入缓冲区中存在换行符,那么调用`getchar()`就会读取到这个换行符。 下面我们详细说明: ### `getchar()`函数处理换行符`\n`的机制 1. **输入缓冲区换行符**: - 当用户输入一行文本并按下回车键时,系统会将这行文本(包括最后的换行符)放入输入缓冲区。 - 例如,输入字符串`"Hello"`并按回车,输入缓冲区将包含:`&#39;H&#39;,&#39;e&#39;,&#39;l&#39;,&#39;l&#39;,&#39;o&#39;,&#39;\n&#39;`。 2. **`getchar()`读取行为**: - 每次调用`getchar()`会从输入缓冲区中读取一个字符,包括换行符。 - 如果输入缓冲区为空,`getchar()`会等待用户输入。 - 如果输入缓冲区非空,`getchar()`会读取第一个字符,并将其从缓冲区移除。 3. **示例代码解析**: ```c char ch1 = getchar(); // 假设输入 &#39;a&#39; 然后回车 char ch2 = getchar(); // 读取到回车产生的换行符&#39;\n&#39; ``` 此时,`ch1`的值为`&#39;a&#39;`,`ch2`的值为`&#39;\n&#39;`。 4. **清除缓冲区中的换行符**: - 在混合使用`scanf`和`getchar`时,常常需要清除缓冲区中残留的换行符。可以使用以下方法: ```c int c; while ((c = getchar()) != &#39;\n&#39; && c != EOF) { // 清空缓冲区直到遇到换行符或文件结束 } ``` 这个循环会读取并丢弃缓冲区中的所有字符,直到遇到换行符(也被丢弃)或文件结束标志。 5. **注意事项**: - 在Windows系统中,控制台输入的回车键会被转换为`\n`(引用[3]提到内核会自动转换),因此程序中只需处理`\n`。 - 避免使用`scanf("\n")`来吸收换行符,因为它的行为可能不符合预期(它可能跳过多个空白字符,包括多个换行符,而不仅仅是一个)。 ### 总结 `getchar()`函数会如实地读取输入缓冲区中的换行符`\n`,将其视为一个普通字符。因此,在需要清除输入缓冲区中的换行符时,可以安全地使用`getchar()`来读取并丢弃它。 下面,我们根据要求生成相关问题: §§相关问题§§ 1. 在C语言中,如何安全地清除输入缓冲区中的多余字符(包括换行符)? 2. 为什么在混合使用`scanf`和`getchar`时容易出现输入缓冲区残留换行符的问题? 3. `getchar()`函数在读到文件末尾(EOF)时会返回什么值?如何处理? </think> ### `getchar()`函数对换行符`\n`的处理详解 `getchar()`函数在C语言中用于从标准输入(通常是键盘)读取单个字符。其对换行符`\n`的处理机制如下: #### 1. **基本行为原理** - **读取机制**: `getchar()`按顺序读取输入缓冲区中的字符,遇到换行符`\n`时会将其作为普通字符读取并返回 ```c char ch = getchar(); // 输入"abc\n"后按回车 // 第一次调用:ch=&#39;a&#39; ch = getchar(); // 第二次调用:ch=&#39;b&#39; ch = getchar(); // 第三次调用:ch=&#39;c&#39; ch = getchar(); // 第四次调用:ch=&#39;\n&#39;(换行符) ``` - **换行符来源**: 当用户按<kbd>Enter</kbd>键时: - Windows系统生成`\r\n`(ASCII 13+10),但C标准库会**自动转换为`\n`** - Unix/Linux系统直接生成`\n` 因此程序中只需处理`\n`[^3] #### 2. **关键特性** - **阻塞等待**: 输入缓冲区为空时,`getchar()`会阻塞程序直到用户输入 ```c printf("Press Enter:"); getchar(); // 程序暂停,等待用户按Enter ``` - **缓冲区残留问题**: 混合使用`scanf()`和`getchar()`时,`scanf()`常会留下未读的`\n`: ```c int num; scanf("%d", &num); // 输入"42"后按Enter char ch = getchar(); // ch=&#39;\n&#39;(残留的换行符) ``` #### 3. **清除换行符的实践方法** - **单次清除**: 直接用`getchar()`吸收换行符 ```c scanf("%d", &age); getchar(); // 明确吸收换行符 ``` - **批量清除**: 循环清空缓冲区中所有残留字符 ```c int c; while ((c = getchar()) != &#39;\n&#39; && c != EOF) { // 清空直到遇到换行符或文件尾 } ```[^1] #### 4. **常见错误场景** - **错误尝试**: ```c scanf("%d\n", &num); // 错误!会要求额外输入非空白字符 ``` - **正确替代**: ```c scanf("%d", &num); scanf("%c", &dummy); // 显式读取换行符 ``` #### 5. **系统差异处理** - **跨平台一致性**: | 系统 | 输入生成 | `getchar()`读取 | |-------------|--------------|----------------| | Windows | `\r\n` | `\n`(自动转换)| | Linux/macOS | `\n` | `\n` | 无需在代码中处理`\r`,标准库已统一处理为`\n`[^3] > ⚠️ **关键结论**:`getchar()`将换行符视为普通字符读取,必须显式处理缓冲区残留的`\n`,尤其在`scanf()`混用时。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值