【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() 用来吸收换行符,不然换行符会被当做一个字符读入数组中,怎么看都对,但结果是错误的

相关推荐
king-xxz2 分钟前
动态规划:斐波那契形(初阶)
算法·动态规划
网络风云30 分钟前
golang中的包管理-下--详解
开发语言·后端·golang
墨楠。42 分钟前
数据结构学习记录-树和二叉树
数据结构·学习·算法
小唐C++1 小时前
C++小病毒-1.0勒索
开发语言·c++·vscode·python·算法·c#·编辑器
S-X-S1 小时前
集成Sleuth实现链路追踪
java·开发语言·链路追踪
文城5211 小时前
Mysql存储过程(学习自用)
数据库·学习·mysql
醇醛酸醚酮酯1 小时前
Leetcode热题——移动零
算法·leetcode·职场和发展
沉默的煎蛋1 小时前
MyBatis 注解开发详解
java·数据库·mysql·算法·mybatis
Aqua Cheng.1 小时前
MarsCode青训营打卡Day10(2025年1月23日)|稀土掘金-147.寻找独一无二的糖葫芦串、119.游戏队友搜索
java·数据结构·算法
夏末秋也凉1 小时前
力扣-数组-704 二分查找
算法·leetcode