牛客上的练习题——打印X形图案(有说明scanf返回值)

要求:

  • 打印用" * "组成的X形图案;
  • 多组输入,一个整数(2~20),表示输出的行数,也表示组成"X"的反斜线和正斜线的长度
  • 针对每行输入,输出用" * "组成的X形图案。
c 复制代码
记得自己敲一下代码,再看下面的答案,答案不唯一(不一定是最优解,仅作参考)
#include <stdio.h>
int main()
{
    int hang = 0;
    while (scanf("%d", &hang) == 1)
    //scanf会有返回值,返回的是成功读取到的个数,可以点击上面的链接进行这个知识点的了解
    
    //while (scanf("%d", &hang) != EOF);
    //上面那个注释掉的也可以,但不建议,下面有说明(有兴趣的可以了解)
    //EOR(-1)

    {
        for (int i = 1; i <= hang; i++)
        {
            for (int j = 1; j <= hang; j++)
            {
                if (j == i || (j + i) == (hang + 1))
                {
                    printf("*");
                }
                else 
                {
                    printf(" ");
                }
            }
            printf("\n");
        }
    }
    return 0;
}


❗️ scanf("%d", &hang) 的返回值规则

只是对%d的进行说明,后面如有碰到其他的会更新scanf返回值的知识点

输入情况 返回值 说明
成功读取一个整数(例如 2, -1, 0) 1 匹配成功
遇到非数字(如 a, #, 4.5 中的 .) 0 匹配失败,没有给 hang 赋值
输入结束(按下 Ctrl+Z 或 Ctrl+D) EOF(通常是 -1) 输入流结束

while (scanf("%d", &hang) != EOF)
while(scanf("%d",&hang)==1)

上面两个如果遇到下面这几种情况会有什么不同和要注意的点

  • 下面如果是输入非整数类型的,会导致死循环,(浮点数那个有点特殊,其实前面的知识点有说 (scanf知识点里面的(目录中找到对应的):scanf介绍🔗)
  • 输入`'a'

    • %d 期望数字,但遇到 'a', scanf 无法匹配,返回 0。
    • 'a' 留在输入缓冲区中(没有被吃掉)。
      ➡️
      • 对 != EOF 来说:0 != EOF → 条件成立 → 进入循环,但里面的代码再次读 'a' → 又失败 → 死循环。❌⚠️
      • 对 == 1 来说:0 == 1 → 条件不成立 → 循环立即退出。✅
  • 输入 4.5

    • 读取到 '4' 时开始匹配,遇到'.'不是整数字符,匹配终止;返回 0,4.5 仍留在输入缓冲区
      ➡️
      • (同 'a' 情况一样)
      • != EOF → 死循环 ❌⚠️
      • == 1 → 退出循环 ✅
输入 scanf 返回值 对 hang 的影响 1、while(scanf(...) != EOF) 2、while(scanf(...) == 1) 程序行为
字符 a 0 不改变(保留上次值) ✅ 返回值 0 != EOF → 继续循环(可能死循环) ❌ 返回值不是 1 → 退出循环 第二种安全,第一种可能死循环
浮点数 4.5 0 不改变 ✅(同上) ❌ 同上,第二种更安全
数字 -1 1 hang = -1 ✅ ✅ 两种都进入循环(正常)
数字 0 1 hang = 0 ✅ ✅ 两种都进入循环(正常)
数字 2 1 hang = 2 ✅ ✅ 两种都进入循环(正常)
Ctrl + Z(EOF) EOF(-1) 不改变 ❌(退出循环) ❌(退出循环) 两种都正常退出
  • 总结:
输入 返回值 != EOF == 1 推荐
合法整数(包括负数/0) 1 ✅ ✅ 两种都可
非整数字符(a, #, 4.5) 0 ⚠️ 死循环 ✅ 正常退出 ✅ 推荐
EOF (Ctrl+Z) EOF (-1) ✅ 正常退出 ✅ 正常退出 ✅ 推荐
相关推荐
Navigator_Z1 小时前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
Peter-OK1 小时前
PostgreSQL学习笔记(入门-进阶-精通说明)
笔记·学习·postgresql
承渊政道2 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
冻柠檬飞冰走茶3 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
橙橙笔记3 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
成都蜀味缘餐饮技术培训学校3 小时前
手撕烤兔技术培训实战指南,秘制腌料配方比例与调制手法
大数据·经验分享·笔记·其他·微信公众平台
希和20275 小时前
免费AI视频生成工具汇总(国内优先,适合做漫剧、短视频,Obsidian笔记版)
人工智能·笔记·音视频
蒸蒸yyyyzwd6 小时前
秋招学习笔记 day109
笔记·八股
Hhy_11077 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
山甫aa7 小时前
锁一篇搞定:乐观锁、悲观锁、CAS、数据库锁与分布式锁【从零开始的 Web 后端学习】
java·数据库·分布式·后端·学习·web