【C语言】输入数字后的重要getchar()

相信你是最棒哒!!!

文章目录

[一、 输出音符位置](#一、 输出音符位置)

正确代码

注释版

简洁版

二、棋盘中的字母

正确代码

注释版

简洁版

总结


一、 输出音符位置

你正在玩你最喜欢的节奏游戏,osu!mania。你的谱面的布局由 n 行和 4 列组成。由于底部的音符更近,因此你将首先处理最底部的行,最后处理最顶部的行。每一行将恰好包含一个音符,用 '#' 表示。

对于每个音符 1,2,...,𝑛按照处理的顺序,输出音符出现的列号。

输入

第一行包含 𝑡t (1≤𝑡≤100) --- 测试用例的数量。

对于每个测试用例,第一行包含 𝑛n (1≤𝑛≤500) --- 谱面的行数。

接下来的 𝑛n 行包含 4 个字符。第 𝑖i 行表示从顶部开始的第 𝑖 行谱面。可以保证字符要么是 '.' 要么是 '#',并且恰好有一个字符是 '#'。

可以保证所有测试用例中 𝑛 的总和不超过 500。

输出

对于每个测试用例,在新的一行中输出 n 个整数,表示从 1 到 n 的所有 i 中音符 i 出现的列号。

示例

Input Output
3 4 #... .#.. ..#. ...# 2 .#.. .#.. 1 ...# 4 3 2 1 2 2 4

正确代码

注释版
复制代码
#include <stdio.h>
 
char a[511][4]; 

int main() 
{
    int n, i,j,k,l,m,t; // 定义整型变量循环和存储数据

    scanf("%d", &n); // n表示接下来有多少组数据

    for (i = 1; i <= n; i++) // 外层循环,遍历每一组数据
    {
        scanf("%d", &t); // 读取一个整数t,表示这一组数据中有多少行。
        getchar(); // 读取并丢弃一个字符,通常是换行符,以确保后续读取字符串时不会读取到错误的数据 
   //这一步非常重要 不写就错啦
        for (j = 1; j <= t; j++) // 中层循环,遍历每一行
        {
            for (k = 1; k <= 4; k++) // 内层循环,遍历每个字符
                scanf("%c", &a[j][k]); // 读取一个字符,并存储到数组a中。
            getchar(); // 读取并丢弃一个字符,通常是换行符。
        }

        for (l = t; l > 0; l--) // 从最后一行开始向上遍历
        {
            for (m = 4; m > 0; m--) // 从最后一个字符开始向左遍历
            {
                if (a[l][m] == '#') // 如果找到`#`字符。
                {
                    printf("%d ", m); // 输出该字符的位置(从1开始计数)。
                    break; // 找到`#`后跳出内层循环。
                }
            }
        }
        printf("\n"); // 每组数据输出完毕后换行。
    }
    return 0; // 主函数返回0,表示程序正常结束
}
简洁版
复制代码
#include <stdio.h>
char a[511][4];
int main()
{
	int n, i,j,k,l,m,t;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		scanf("%d", &t);
		getchar();
		for (j = 1; j <= t; j++)
		{
			for (k = 1; k <= 4; k++)
				scanf("%c", &a[j][k]);
			getchar();
		}
		for (l = t; l > 0; l--)
		{
			for (m = 4; m > 0; m--)
			{
				if (a[l][m] == '#')
				{
					printf("%d ", m);
					break;
				}
			}
		}
		printf("\n");
	}
	return 0;
}

二、棋盘中的字母

问题描述

在一个8×8点的网格上,一个由小写拉丁字母组成的单词垂直地写在一列中,从上到下。这是什么单词?

输入

输入包含多个测试用例。输入的第一行包含一个整数t(1≤𝑡≤1000)--- 测试用例的数量。

每个测试用例包含8行,每行包含88个字符。网格中的每个字符都是..(表示一个点)或小写拉丁字母(a--z)。

这个单词完全位于一列中,并且从开始到结束连续(没有间隙)。请参考示例输入以获得更好的理解。

输出

对于每个测试用例,输出一行,其中包含由小写拉丁字母组成的单词(a--z),该单词垂直地写在一列中,从上到下。

示例

Input Output
5 ........ ........ ........ ........ ...i.... ........ ........ ........ ........ .l...... .o...... .s...... .t...... ........ ........ ........ ........ ........ ........ ........ ......t. ......h. ......e. ........ ........ ........ ........ ........ .......g .......a .......m .......e a....... a....... a....... a....... a....... a....... a....... a....... i lost the game aaaaaaaa

正确代码

注释版
复制代码
#include <stdio.h> 

char a[8][9]; // 声明一个8x9的字符数组,用于存储棋盘的布局,每个格子可以存储一个字符和一个换行符

int main() 
{
    int n, i, j, k, l, m; 
    scanf("%d", &n); // 棋盘数量
    getchar(); // 读取并丢弃换行符,以避免影响后续的输入 这一步也和上一题一样重要呦

    for (i = 1; i <= n; i++) // 外层循环,控制读取和打印棋盘的数量
    {
        for (j = 0; j < 8; j++) // 中层循环,控制棋盘的行
        {
            for (k = 0; k <= 8; k++) // 内层循环,控制棋盘的列
                scanf("%c", &a[j][k]); 
        }
        
        for (l = 0; l < 8; l++) // 外层循环,控制行
        {
            for (m = 0; m < 8; m++) // 内层循环,控制列
            {
                if (a[l][m] != '.' && a[l][m] != '\n') // 如果当前格子不是空格也不是换行符,则打印
                    printf("%c", a[l][m]); // 打印当前格子的字符
            }
        }
        printf("\n"); // 每打印完一个棋盘后换行
    }
    return 0; // 程序正常结束
}
简洁版
复制代码
#include <stdio.h>
char a[8][9];
int main()
{
	int n, i,j,k,l,m;
	scanf("%d", &n);
	getchar();
	for (i = 1; i <= n; i++)
	{
		for (j = 0; j < 8; j++)
		{
			for (k = 0; k <= 8; k++)
				scanf("%c", &a[j][k]);
			
		}
		for (l = 0; l < 8; l++)
		{
			for (m = 0; m < 8; m++)
			{
				if (a[l][m] != '.' && a[l][m] != '\n')
					printf("%c", a[l][m]);
			}
		}
		printf("\n");
	}
	return 0;
}

总结

输入数字之后要加上一个getchar() 用来吸收换行符,不然换行符会被当做一个字符读入数组中,怎么看都对,但结果是错误的

相关推荐
·present·3 分钟前
CSAPP(lecture 13_02 Linking)
c语言·c++
早起CaiCai4 分钟前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
梦里寻码39 分钟前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
FRing0341 分钟前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2
旖旎夜光43 分钟前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
猿人谷1 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
starzy19901 小时前
深入理解Scala嵌套函数:作用域封装之道
开发语言·scala
Sakura_j_h_1 小时前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
青少儿编程课堂3 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛