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

相关推荐
violet_evergarden.11 分钟前
【51单片机】矩阵按键快速上手
c语言·笔记·单片机·嵌入式硬件·矩阵·51单片机
caifox14 分钟前
C# 探险之旅:第二十六节 - 类型class(对象Object),一场“建房大业”的比喻
开发语言·c#
raoxiaoya21 分钟前
golang中的值传递与引用传递,如何理解结构体的方法?为什么 T 和 *T 有不同的方法集?
开发语言·后端·golang
睡睡怪1 小时前
【Java学习笔记】JUnit
笔记·学习·junit
蒙娜丽宁1 小时前
【人工智能】用Python构建高效的自动化数据标注工具:从理论到实现
开发语言·python·自动化
材料苦逼不会梦到计算机白富美1 小时前
go高性能单机缓存项目
开发语言·缓存·golang
加德霍克1 小时前
Opencv之图像添加水印
图像处理·python·opencv·学习·计算机视觉
忘却的纪念1 小时前
基于SpringBoot的嗨玩旅游网站:一站式旅游信息服务平台的设计与实现
java·开发语言·spring boot·后端·毕业设计·旅游