一些小的问题

news2024/11/29 2:54:54

是否是质数?

在这里插入图片描述

#include <stdio.h>
#include <stdbool.h>

bool is_prime(int num);

int main() {
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);
    
    if (is_prime(num)) {
        printf("%d是质数。\n", num);
    } else {
        printf("%d不是质数。\n", num);
    }
    
    return 0;
}

bool is_prime(int num) {
    if (num < 2) {
        return false;
    }
    for (int i = 2; i * i <= num; i++) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}

矩阵的乘法

#include <stdio.h>

#define MAX_ROW 4
#define MAX_COL 5

int main()
{
    int a[MAX_ROW][3], b[3][MAX_COL], c[MAX_ROW][MAX_COL];

    // 输入矩阵A和B的数据
    printf("请输入矩阵A的数据:\n");
    for (int i = 0; i < MAX_ROW; i++) {
        for (int j = 0; j < 3; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    printf("请输入矩阵B的数据:\n");
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < MAX_COL; j++) {
            scanf("%d", &b[i][j]);
        }
    }

    // 计算矩阵C的值
    for (int i = 0; i < MAX_ROW; i++) {
        for (int j = 0; j < MAX_COL; j++) {
            c[i][j] = 0;
            for (int k = 0; k < 3; k++) {
                c[i][j] += a[i][k] * b[k][j];
            }
        }
    }

    // 输出矩阵C的值
    printf("\n矩阵C的值为:\n");
    for (int i = 0; i < MAX_ROW; i++) {
        for (int j = 0; j < MAX_COL; j++) {
            printf("%d ", c[i][j]);
        }
        printf("\n");
    }

    return 0;
}

在这个示例代码中,我们首先定义了三个矩阵a、b和c,其中a和b分别为4行3列和3行5列的矩阵,c为4行5列的矩阵。用户可以通过标准输入输入矩阵a和b的数据,然后程序计算出矩阵c的值,并输出到屏幕上。

矩阵乘法的核心代码在于第三重循环中的计算方法,即对于矩阵C中的每一个元素c[i][j],都需要将矩阵A中第i行的元素和矩阵B中第j列的元素逐一相乘,并将它们的积累加起来,最终得到c[i][j]的值。

回形矩阵

#include <stdio.h>

#define MAX_N 10

int main()
{
    int n;
    int a[MAX_N][MAX_N];
    int num = 1; // 当前要填充的数值,从1开始

    // 输入n的值
    printf("请输入n的值:");
    scanf("%d", &n);

    // 初始化矩阵a
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            a[i][j] = 0; // 初始值设为0
        }
    }

    // 回形遍历方阵,并填充数值
    int row = 0, col = 0; // 当前位置的行和列
    while (num <= n * n) { // 循环条件:还有未填充的数值
        // 第一步:向右走到尽头(直到达到边界或者遇到已经填充的数值)
        while (col < n && a[row][col] == 0) {
            a[row][col++] = num++; // 填充当前位置并将列坐标加1
        }
        col--; // 因为最后一次填充时超出了边界,所以需要将列坐标减回来
        row++; // 将行坐标加1,准备向下走

        // 第二步:向下走到尽头(同样需要判断边界和已填充数值)
        while (row < n && a[row][col] == 0) {
            a[row++][col] = num++; // 填充当前位置并将行坐标加1
        }
        row--; // 同理,需要将行坐标减回来
        col--; // 将列坐标减1,准备向左走

        // 第三步:向左走到尽头
        while (col >= 0 && a[row][col] == 0) {
            a[row][col--] = num++; // 填充当前位置并将列坐标减1
        }
        col++; // 将列坐标加1,准备向上走
        row--; // 将行坐标减1,准备向上走

        // 第四步:向上走到尽头
        while (row >= 0 && a[row][col] == 0) {
            a[row--][col] = num++; // 填充当前位置并将行坐标减1
        }
        row++; // 将行坐标加1,准备向右走
        col++; // 将列坐标加1,准备向右走
    }

    // 输出结果
    printf("\n回形遍历方阵结果为:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%3d ", a[i][j]);
        }
        printf("\n");
    }

    return 0;
}

在这个示例代码中,我们首先接收用户输入的n值,并初始化一个n*n的矩阵a。然后我们使用四个while循环依次完成“右下左上”的遍历过程,并将递增的num值填充到矩阵a中。最后我们输出矩阵a的结果到屏幕上。

需要注意的一点是,在每次while循环结束后,row和col的值都需要调整回上一个合法的位置,以便进行下一次循环。

为什么说scanf和gets是不安全的,而fgets是安全的?

scanf 和 gets 函数被认为是不安全的,因为它们无法处理输入数据的长度和内容,容易导致缓冲区溢出和安全漏洞。相反,fgets 函数被认为是安全的,因为它可以指定读取的最大字符数,并且只会读取指定数量的字符,从而避免了缓冲区溢出。

具体来说,scanf 和 gets 函数存在以下问题:
  • scanf 函数无法限制输入数据的长度,因此很容易导致缓冲区溢出。例如,如果使用 %s 格式化符读取一个超过目标缓冲区大小的字符串,则会导致缓冲区溢出。
  • gets 函数同样无法限制输入数据的长度,它会一直读取数据,直到读取到换行符或者达到缓冲区的末尾。这种行为容易导致缓冲区溢出,因为恶意用户可以通过输入长字符串来覆盖缓冲区之外的内存。
相比之下,fgets 函数有如下优点:
  • fgets 可以指定读取的最大字符数,这可以帮助我们控制输入数据的长度,避免缓冲区溢出。
  • fgets 一次只能读取指定数量的字符,它会在读取到给定数量的字符、读取到换行符或到达缓冲区末尾时停止读取,因此可以避免恶意用户输入超长字符串,从而防止缓冲区溢出和安全漏洞。
    综上所述,scanf 和 gets 函数存在安全问题,应该尽量避免使用,而 fgets 函数则是一种更安全可靠的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/572595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【萌新指南】如何获得铁粉?快收下我为你精心定制的涨粉秘籍吧

文章目录 前言"铁粉"介绍"铁粉"规则"铁粉"获取高质量博客坚持写博客参与活动 尾声 前言 目前博主的"铁粉"数量 "铁粉"介绍 "铁粉"是为了帮助博主解决上面提到的问题和困惑&#xff0c; CSDN 设计的一个功能&…

STM8、STM8S003F3P6 通过ZM470SX-MP模组实现lora通信

背景 现在物联网就是很火&#xff0c;lora是避免不开的&#xff0c;也有个项目采用STM8S003F3P6 使用周立功的lora模组ZM470SX-MP实现lora通信。 原理图 废话少说&#xff0c;上原理图 这个原理图我找了很久都没有找到&#xff0c;指示找到了管脚图&#xff0c;这个原理图非…

Linux——线程的同步与互斥

目录 模拟抢火车票的过程 代码示例 thread.cc Thread.hpp 运行结果 分析原因 tickets减到-2的本质 解决抢票出错的方案 临界资源的概念 原子性的概念 加锁 定义 初始化 销毁 代码形式如下 代码示例1&#xff1a; 代码示例2&#xff1a; 总结 如何看待锁 申…

2.自然语言处理NLP:词映射为向量——词嵌入(word embedding)

1. 什么是词嵌入&#xff08;word2vec&#xff09; &#xff1a; 把词映射为向量&#xff08;实数域&#xff09;的技术 2. 为什么不采用one-hot向量&#xff1a; one-hot词向量无法准确表达不同词之间的相似度&#xff0c;eg&#xff1a;余弦相似度&#xff0c;表示夹角之间的…

创新案例|Amazon如何打造增长飞轮保持每年20%以上的营收增速

作为世界五百强中的头部企业&#xff0c;亚马逊的价值定位经历了三次转变&#xff0c;从成为“地球上最大的书店”&#xff0c;到成为最大的综合网络零售商&#xff0c;再到成为“最以客户为中心的企业”&#xff0c;亚马逊最终以“客户中心”破除了对企业价值定位的束缚&#…

DNS风险分析及安全防护研究(三):DNS缓存投毒及防御策略

在前面章节中&#xff0c;我们简单介绍了DNS系统在协议、软件以及结构中脆弱性&#xff0c;并对DNSSEC协议、去中心化结构等安全增强进行了讨论&#xff0c;接下来针对DNS安全所面临的外部攻击威胁和相应的防御策略做下讨论。 1.DNS缓存投毒攻击 在目前各种DNS攻击手段中&…

安科瑞浅谈集成式电力电容器无功补偿装置的技术特点

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;阐述了集成式电力电容器无功补偿装置的组成与应用状况&#xff0e;在与常规电力电容器对比的基础上&#xff0c;分析了集成式电力电容器无功补偿装置的技术特点。通过对集成式无功补偿装置原理结构的…

Linux文件系统、磁盘I/O是怎么工作的?

同CPU、内存一样&#xff0c;文件系统和磁盘I/O&#xff0c;也是Linux操作系统最核心的功能。磁盘为系统提供了最基本的持久化存储。文件系统则在磁盘基础上&#xff0c;提供了一个用来管理文件的树状结构。 目录&#xff1a; 一. 文件系统 1. 索引节点和目录项 2. 虚拟文件系…

提升国际品牌影响力:小企业海外网红营销实战指南

在当今数字化时代&#xff0c;小企业们越来越意识到海外市场的巨大潜力。与此同时&#xff0c;海外网红的崛起也为小企业提供了一个独特的机会&#xff0c;通过与他们合作&#xff0c;迅速拓展国际市场并吸引更多目标受众的关注。然而&#xff0c;对于许多小企业来说&#xff0…

超全性能测试-全链路压测总结,完整一套从环境到脚本详细...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试&#xf…

类和对象 --- 封装+对象特性

&#x1f442; 快乐E调 - 林澜叶 - 单曲 - 网易云音乐 &#x1f442; Plain Jane (Freestyle) - Ombre2Choc Nation - 单曲 - 网易云音乐 1.5倍速&#xff0c;跟着敲&#xff0c;初识C 目录 &#x1f3c6;封装 &#x1f333;属性和行为作为整体 &#x1f333;案例 -- 设置…

js数组去重与循环对象

目录 一、数组对象去重 1.1、需要获取重复数据 1.2、直接过滤filterfindIndex 二、循环对象 三、多层数组对象过滤 一、数组对象去重 1.1、需要获取重复数据 let persons [{"name": "yzq","age": 20,"gender": true,"hei…

k8s配置资源管理|secret|configmap

k8s配置资源管理|secret|configmap 一 配置资源管理1 创建 Secret2 使用方式3 将 Secret 导出到环境变量中 二 ConfigMap1 Pod 中使用 ConfigMap2 Pod的创建3 用 ConfigMap 设置命令行参数4 通过数据卷插件使用ConfigMap 一 配置资源管理 //Secret Secret 是用来保存密码、tok…

2023年6月合肥/厦门/长春/深圳DAMA-CDGP数据治理专家认证报名

目前6月18日CDGA&CDGP考试目前开放的城市有&#xff1a;北京、上海、广州(满)、深圳、长沙、呼和浩特、杭州&#xff08;满&#xff09;、南京、济南&#xff08;满&#xff09;、成都、西安、武汉&#xff08;满&#xff09;、天津。 新增了武汉、天津这2个城市。另外合肥…

【Netty】Reactor 模型(十)

文章目录 前言一、传统服务的设计模型二、NIO 分发模型三、Reactor 模型3.1、Reactor 处理请求的流程3.2、Reactor 三种角色 四、单Reactor 单线程模型4.1、消息处理流程4.2、缺点 五、单Reactor 多线程模型5.1、消息处理流程5.2、缺点 六、主从Reactor 多线程模型6.1、Reactor…

Python的一些基础实操练习题

书接上文多看一眼多进步&#xff0c;python入门到放弃&#xff0c;是根据python的知识点的一些基础练习题&#xff0c;说了是基础练习题&#xff0c;基础练习题&#xff0c;基础练习题&#xff0c;水平高的就别看了&#xff0c;平高的就别看了&#xff0c;高的就别看了&#xf…

IP协议-服务类型字段

服务类型&#xff08;Type of Service&#xff09;字段是比较复杂的一个字段&#xff0c;该字段经过多次标准变更。 IPv4报文 一、最初标准&#xff08;RFC 791&#xff09; RFC 791定义TOS字段总共占用8bit&#xff0c;分为IP Precedence优先级&#xff08;3bit&#xff09;、…

Ansys Zemax | 如何将高斯光整形为平顶光

概要 本文展示了如何设计光束整形器将激光器产生的高斯分布的光转换为平顶分布的光输出。&#xff08;联系我们获取文章附件&#xff09; 介绍 光束整形光学元件可以将入射光的光强分布转换为其他特定的分布输出。最常见的例子就是将激光器产生的高斯分布的光转换为平顶&#x…

GMesh的Mesh操作面板介绍

GMesh操作面板介绍 Define 用于控制网格生成过程中各个单元的尺寸大小 “Size at points”选项允许您指定空间中某些点的尺寸大小。这些点可以是模型的几何结构中的点&#xff0c;也可以是在Gmsh中手动定义的点&#xff08;使用“Point”命令&#xff09;。在这种情况下&…

pycharm在终端运行时ps 不显示环境

如果下面显示的是ps ----- 而不是 则需要把这儿修改一下