uva 784 DFS 染色问题。有坑点。一个getchar()

#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

char mapp[35][85];
int vis[35][85];
int p;
int dir[][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y)
{
    for(int i=0;i<4;i++)
    {
        int nx=x+dir[i][0];
        int ny=y+dir[i][1];
        if(nx>=0 && nx<p && ny>=0 &&ny<strlen(mapp[nx])&&vis[nx][ny]==0&&mapp[nx][ny]==' ')
        {
            vis[nx][ny]=1;
            mapp[nx][ny]='#';
            dfs(nx,ny);
        }
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        int i=0;
        while(1)
        {
            gets(mapp[i++]);
            if(mapp[i-1][0]=='_')
                break;
        }
        p=i;
        for(int j=0;j<p;j++)
           for(int k=0;k<strlen(mapp[j]);k++)
           if(mapp[j][k]=='*'&&!vis[j][k])
        {
            mapp[j][k]='#';
            vis[j][k]=1;
            dfs(j,k);
        }
         for(int j=0;j<p;j++)
                printf("%s\n",mapp[j]);
    }
    return 0;
}

<think>好的,用户现在问的是单独一个getchar()有什么用。之前他们问过scanf输入字符串的问题,现在转向getchar,可能是在学习输入函数时遇到了疑问。我需要先回忆getchar的基本功能,然后结合常见使用场景来解释。 首先,getchar()是C语言标准库里的函数,用于从标准输入(通常是键盘)读取一个字符。不带参数,返回读取的字符的ASCII码值,遇到错误或EOF时返回EOF。单独使用的话,可能用户看到的是单独一行代码,比如getchar();,而没有处理返回值,这时候可能有几种用途。 常见的场景之一是清除输入缓冲区。比如在使用scanf后,输入缓冲区可能残留换行符或者未读取的字符,导致后续输入函数直接读取这些残留内容。这时候用getchar()可以消耗掉这些多余的字符,避免程序逻辑错误。但要注意,如果缓冲区有多个字符,单独一个getchar可能不够,需要用循环处理。 另一个场景是暂停程序,等待用户按回车继续。比如在控制台程序中,显示结果后暂停,防止窗口一闪而过。这时候可以用getchar()等待用户输入任意字符,但需要确保输入缓冲区是空的,否则可能不会等待。可能需要先用fflush(stdin)或者在getchar前清除缓冲区。 用户可能对getchar的具体机制不太清楚,比如返回值处理的问题。单独使用getchar();的话,返回值会被忽略,但确实会从缓冲区读取一个字符。需要解释清楚这种情况下它消耗了一个字符,但没做其他处理。 另外,用户可能混淆getchar()和其他输入函数,比如scanf或fgets,需要说明它们的不同。getchar每次只读一个字符,而其他函数可能读取更多。单独使用的情况下,可能用于简单的交互,比如按任意键继续。 还需要提到潜在的问题,比如缓冲区残留导致的问题,或者处理多个字符时的不足。同时给出改进建议,比如循环清除缓冲区,或者使用更安全的函数。 总结下来,回答需要涵盖getchar的基本功能,单独使用时的常见用途(清缓冲、暂停程序)、注意事项以及可能的替代方法。用例子说明会更清楚,比如清除缓冲区的代码示例,暂停程序的示例,同时对比其他方法,如system("pause"),但指出跨平台问题。 要确保语言通俗易懂,避免过于技术化的术语,但保持准确。结构上分列出,每个用途配合示例和解释,帮助用户理解不同情况下的应用。最后总结,强调根据需求选择合适的方法,并指出最佳实践。</think>`getchar()` 是 C 语言标准库函数,其核心功能是**从标准输入(键盘)读取单个字符**。以下是它的详细用途和注意事项: --- ### **1. 基本功能** - **语法**:`int getchar(void);` - **返回值**: - 成功时返回读取字符的 ASCII 码值(`int` 类型)。 - 失败或遇到文件结束符(EOF)时返回 `EOF`。 - **特**: - 每次调用读取**一个字符**(包括空格、换行符等)。 - 按回车键后才会处理输入(输入内容会先存入缓冲区)。 ```c char c = getchar(); // 输入 'A',c 被赋值为 'A' ``` --- ### **2. 常见用途** #### **(1) 清空输入缓冲区** 在 `scanf` 等函数后,残留的换行符或未读字符可能导致后续输入错误。通过 `getchar()` 清理缓冲区: ```c int num; scanf("%d", &num); // 输入数字后按回车 getchar(); // 清除缓冲区残留的换行符 '\n' ``` #### **(2) 暂停程序** 让程序等待用户按下回车键继续执行(类似 `system("pause")`,但跨平台): ```c printf("按回车继续..."); getchar(); // 等待用户按回车 ``` #### **(3) 逐字符处理输入** 循环读取用户输入的每个字符(例如实现简易命令行交互): ```c int c; while ((c = getchar()) != '\n' && c != EOF) { printf("输入字符:%c\n", c); } ``` --- ### **3. 关键注意事项** - **缓冲区残留问题**: ```c // 若输入 "abc" 后按回车 getchar(); // 只读取 'a',缓冲区仍剩 'b', 'c', '\n' ``` 需用循环彻底清空缓冲区: ```c while ((c = getchar()) != '\n' && c != EOF); ``` - **返回值必须用 `int` 接收**: ```c int c = getchar(); // 正确!可兼容 EOF(-1) char c = getchar(); // 错误!无法正确处理 EOF ``` - **与 `putchar()` 配合使用**: ```c int c = getchar(); putchar(c); // 输出读取的字符 ``` --- ### **4. 对比其他输入函数** | 函数 | 特 | 适用场景 | |---------------|-----------------------------|---------------------| | `getchar()` | 读取单个字符,简单直接 | 逐字符处理、清空缓冲区 | | `scanf("%c")` | 可跳过空格(依赖格式字符串) | 格式化的字符输入 | | `fgets()` | 安全读取整行(含空格) | 输入字符串或多字符内容 | --- ### **总结** - `getchar()` 是 C 语言中**最基础的字符输入函数**,适合简单交互或底层字符处理。 - 单独使用 `getchar()` 常见于清空缓冲区、暂停程序等场景。 - 重要原则:**始终检查返回值**,正确处理 `EOF` 和缓冲区残留。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值