getchar()与putchar()的简单使用

先看一个小例子(ctrl+z终止):

#include <stdio.h>
int main()
{
        int c;
     
        c = getchar();
        while(c != EOF)
        {   
                putchar(c);
                c = getchar();
        }   
        return 0;
}
此例子是简单的把输入一次一个的简单的复制到输出.

c=getchar()函数从文本流中读入一个输入字符,并将其作为结果值返回.

putchar(c)函数将整型变量c的内容以字符的形式打印出来,通常显示在屛幕上.



<think>由于用户要求使用getcharputchar进行输入输出,因此我们需要考虑逐个字符读取输入,并存储到一个字符数组中(或者不存储直接判断,但回文需要比较,所以需要存储)。但是,由于我们不知道输入字符串的长度,所以我们需要一个足够大的数组来存储。 思路: 1. 使用getchar逐个读取字符,直到遇到换行符('\n')或者文件结束符(EOF)为止。 2. 将读取的字符存储到一个字符数组中,并记录字符的个数(即字符串长度)。 3. 然后使用双指针法判断这个字符数组(字符串)是否是回文:一个指针从前往后,一个指针从后往前,比较对应位置的字符是否相等,直到两个指针相遇或交叉。如果中间有不相等的情况,则不是回文。 4. 根据判断结果,使用putchar逐个字符输出"YES"或"NO",也可以使用printf输出,但题目要求使用getcharputchar,所以输出也使用putchar。 注意:输入可能包含空格?题目没有说,但通常回文字符串的题目中,空格也是字符。但是题目样例是“noon”没有空格。所以按照题目要求,我们只读取一行(以换行符结束),并且不包含换行符。 由于题目要求输出一行,所以输出后需要输出一个换行符。 步骤: 1. 定义字符数组,大小可以设为100(假设输入不超过100个字符)。 2. 使用getchar循环读取,直到遇到换行符('\n')停止,将字符存入数组,并记录长度。 3. 判断回文。 4. 使用putchar输出结果(输出字符串"YES"或"NO"),然后输出换行符。 但是,也可以不用存储整个字符串,而是用两个指针在读取的同时进行比较?实际上不行,因为我们需要从两端比较,而输入是顺序的,所以需要存储。 另一种思路(不使用数组存储,但需要递归或栈,但题目要求函数判断,且主函数调用,所以可能不合适):如果不用数组,那么就需要将输入全部存储下来,因为后面的字符需要和前面的字符比较。 因此,我们使用数组存储。 代码结构: 注意:题目要求编函数int mirror(char *p),所以我们还是需要将读取的字符串存入数组,然后传递给mirror函数。 但是,现在用户要求使用getcharputchar来输入输出,所以我们用getchar读取字符串,然后用mirror函数判断。 具体步骤: 1. 在main函数中,使用getchar循环读取字符,直到遇到换行符或EOF,将字符依次存入数组,并在末尾添加'\0',形成字符串。 2. 调用mirror函数,传入该字符串。 3. mirror函数使用双指针法判断回文,返回1表示是回文,0表示不是。 4. 根据返回值,使用putchar逐个字符输出'Y','E','S'或者'N','O',然后输出换行符。 但是,题目要求输出一行,所以输出"YES"或"NO"后要换行。 注意:由于输入可能包含空格?题目没有明确,但样例没有空格,且输入格式是“第一行:输入字符串”,所以按一行读取(以换行结束)。 代码实现: </think> 以下是使用`getchar`和`putchar`实现回文判断的C语言程序: ```c #include <stdio.h> #include <ctype.h> // 用于大小转换 int mirror(char *p) { char *start = p; char *end = p; // 定位字符串末尾 while (*end != '\0') end++; end--; // 指向最后一个有效字符 while (start < end) { // 比较字符(忽略大小) if (tolower(*start) != tolower(*end)) return 0; start++; end--; } return 1; } int main() { char str[100]; int i = 0; char c; // 使用getchar读取输入 while ((c = getchar()) != '\n' && c != EOF) { str[i++] = c; } str[i] = '\0'; // 添加字符串结束符 // 使用putchar输出结果 if (mirror(str)) { putchar('Y'); putchar('E'); putchar('S'); } else { putchar('N'); putchar('O'); } putchar('\n'); // 输出换行 return 0; } ``` ### 代码说明: 1. **输入处理**: - 使用`getchar`逐字符读取输入,直到遇到换行符或EOF - 将字符存入缓冲区`str`并添加结束符`\0` - 示例:输入"radar" → 存储为['r','a','d','a','r','\0'] 2. **回文判断**: - 双指针法:`start`从头部开始,`end`从尾部开始 - 使用`tolower`忽略大小差异(如"RaceCar"仍视为回文) - 时间复杂度:$O(n)$,空间复杂度:$O(1)$ 3. **输出处理**: - 使用`putchar`逐个字符输出结果 - 是回文:输出字符'Y','E','S' - 非回文:输出字符'N','O' - 最后输出换行符`\n` 4. **处理示例**: ```plaintext 输入: level 输出: YES 输入: hello 输出: NO 输入: RaceCar 输出: YES ``` ### 算法优化: 1. **就地比较**:无需额外存储空间,直接比较原始字符串 2. **边界处理**:空字符串("")和单字符("a")自动视为回文 3. **效率优化**:当发现不匹配时立即终止比较
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值