C语言中的一些小知识(三)

news2024/9/21 22:53:06

一、你了解printf()吗?

你知道下面代码的输出结果吗?

int a=123;
printf("%2d \n",a);

printf() 函数是 C 语言中用于格式化输出的标准函数,它允许你将数据以特定的格式输出到标准输出设备(通常是屏幕)。printf() 函数定义在 <stdio.h> 头文件中。它的基本语法如下:

#include <stdio.h>

int main() {
    // 输出字符串
    printf("Hello, World!\n");

    // 输出整数
    int num = 10;
    printf("The number is: %d\n", num);

    // 输出浮点数
    double pi = 3.14159;
    printf("Pi is: %.2f\n", pi);//.2指的是保留小数点后两位小数

    // 输出字符
    char ch = 'A';
    printf("The character is: %c\n", ch);

    // 输出多个变量
    int a = 5;
    float b = 2.5;
    printf("a = %d, b = %f\n", a, b);

    // 输出宽度和精度
    printf("Width 5, precision 2: %5.2f\n", pi);//5指的是输出的字符串字宽为五,默认输出结果靠右

    // 输出十六进制
    int hex = 255;
    printf("Hexadecimal: %x\n", hex);

    // 输出八进制
    int oct = 255;
    printf("Octal: %o\n", oct);

    // 输出指针
    int val = 10;
    int *ptr = &val;
    printf("Value: %d, Address: %p\n", val, (void*)ptr);

    // 输出长整型
    long l = 1234567890;
    printf("Long integer: %ld\n", l);

    // 输出无符号整数
    unsigned int u = 4294967295;
    printf("Unsigned int: %u\n", u);

    // 输出长双精度浮点数
    long double ld = 123456789.0123456789L;
    printf("Long double: %Lf\n", ld);

    return 0;
}
Hello, World!
The number is: 10
Pi is: 3.14
The character is: A
a = 5, b = 2.500000
Width 5, precision 2:  3.14
Hexadecimal: ff
Octal: 377
Value: 10, Address: 00F3F8CC
Long integer: 1234567890
Unsigned int: 4294967295
Long double: 123456789.012346
请按任意键继续. . .

对于开始的题目,你是否有自己想法了呢?下面就让我们用一段C程序验证一下吧!

#include <stdio.h>

int main() {

   int a=123;
   printf("%2d \n",a);

    return 0;
}

输出结果如下:

123

 你是不是又有了自己的判断那我再考你一个,如果不确定就自己动手试一下吧!

double a=123.123;
printf("%2f\n",a);

二、你知道常量指针吗?

看看下面这个C程序,输出结果是啥?

#include <stdio.h>

int main() {
	char s[]="asdf";
	s+=2;
	printf("%d\n",s[0]);
    return 0;
}
#include <stdio.h>

int main() {
    char *s="asdf";
    s += 2;  // s 现在指向 'd'
    printf("%c\n", s[0]);  // 打印 'd'
    return 0;
}
#include <stdio.h>

int main() {
    char *s="asdf";
    printf("%c\n", s);  // 打印 'd'
    return 0;
}

三、 认识gets()函数、了解输入流

通过下面的程序我们了解一下啊gets()的用法和字符串流入计算机的方式

#include <stdio.h>

int main() {
	char a[20],b[]="The sky blue.";
	int i;
	for(i=0;i<7;i++)
		scanf("%c",&b[i]);
	gets(a);
	printf("%s%s\n",a,b);

    return 0;
}

运行程序后我们在键盘上输入fig flower is red.<回车>,程序通过for(i=0;i<7;i++; scanf("%c",&b[i]);b[]就获取到前七个字符"fig flo",新获取的字符将会原字符覆盖掉,通过gets(a),就将剩余部分的数据放入到了a[20]中。

fig flower is red.
wer is red.fig flo blue.
请按任意键继续. . .

下面我们来介绍一下get()函数:

gets() 函数是 C 语言标准库中的一个函数,用于从标准输入(通常是键盘)读取一行文本。然而,gets() 函数在 C11 标准中已经被废弃了,因为它是不安全的,容易导致缓冲区溢出的安全问题。

尽管如此,了解 gets() 函数的用法对于学习历史和理解为什么它被废弃是有帮助的。以下是 gets() 函数的基本用法:

函数原型

char *gets(char *str);

参数

  • str:指向字符数组的指针,用于存储输入的字符串。

返回值

  • 成功时返回 str 指向的字符串。
  • 失败时返回 NULL

用法示例

#include <stdio.h>

int main() {
    char buffer[100];

    printf("Enter a line of text: ");
    gets(buffer);  // 读取一行文本

    printf("You entered: %s\n", buffer);

    return 0;
}

在这个示例中,我们定义了一个字符数组 buffer 来存储用户输入的文本。使用 gets() 函数读取一行文本,并将其存储在 buffer 中。然后,我们打印出用户输入的文本。

安全问题

gets() 函数不检查目标缓冲区的大小,因此如果用户输入的文本超过了缓冲区的大小,就会导致缓冲区溢出,可能会覆盖内存中的其他数据,导致程序崩溃或安全漏洞。

替代方案

由于 gets() 函数的不安全性,推荐使用 fgets() 函数作为替代。fgets() 函数允许指定缓冲区的大小,从而避免缓冲区溢出的问题。

#include <stdio.h>
#include <string.h>
int main() {
    char buffer[100];

    printf("Enter a line of text: ");
    fgets(buffer, sizeof(buffer), stdin);  // 读取一行文本

    // 去除可能读取的换行符
    buffer[strcspn(buffer, "\n")] = 0;

    printf("You entered: %s\n", buffer);

    return 0;
}
Enter a line of text: efgortuvhasqtvabn;lr uhgoei3pr ghjupw;aoe9irjufg [o0e3;r4i9ghjvnaw;o0i38er4ghjnva['pw-io94jfr['apiorw490e3ghjnieokrpjgmerpighjeoi8gvhjnfgv/vao;'iw34ift0rwgh4we0r tjug3[-]9tfjuwpr4gihqao9iu hjf9-[4ujfwp'-gtju53igtyhn038wqjfhrm 0[ mfju49 gt0yh58cm [t50y8 g9etcm[0 0cmu c9t ,u,tgyhuh0 r8egotyv89 ghgr oio
You entered: efgortuvhasqtvabn;lr uhgoei3pr ghjupw;aoe9irjufg [o0e3;r4i9ghjvnaw;o0i38er4ghjnva['pw-io94jfr['apio
请按任意键继续. . .

在这个替代示例中,我们使用 fgets() 函数读取一行文本,并指定缓冲区的大小。这样可以确保不会超出缓冲区的范围,从而提高程序的安全性。

总之,虽然了解 gets() 函数的用法是有益的,但在实际编程中应该避免使用它,而是使用更安全的 fgets() 函数。

四、静态变量?

大家看一看下面这一行程序,有没有觉得运行结果应该是4,7,10,13,的,有没有怀疑过自己的静态变量的知识点记错了。

这里一定要看清n=0;这一个语句。

#include <stdio.h>
int a=2;
int f(int m){
	static int n;
	n=0;
	n++;
	a++;
	return n+m+a;
}
int main() {

	int k;
	for(k=0;k<4;k++)
		printf("%d,",f(k));

    return 0;
}
4,6,8,10,请按任意键继续. . .

在C语言中,静态变量(static variable)是一种特殊的变量存储类别,它具有持久的存储期,这意味着静态变量的值在函数调用之间是持久的。静态变量的用途和特性如下:

1. 持久性

静态变量在程序的整个运行期间都存在,它们的值在函数调用之间不会消失。这与自动变量(如局部变量)不同,后者在函数调用结束后其值会丢失。

2. 初始化

静态变量在程序开始运行时初始化一次,如果未显式初始化,则默认为0。一旦初始化,它们的值在后续的函数调用中会保留,除非显式地修改它们。

3. 作用域

静态变量的作用域通常与定义它们的函数或文件相同。如果静态变量在函数内部定义,则它只能在该函数内部访问。如果它在函数外部定义,则在整个文件中都可以访问。

4. 链接性

静态变量的链接性可以是内部的(static 关键字)或外部的(默认)。具有内部链接性的静态变量只能在定义它们的文件中访问,而具有外部链接性的静态变量可以在其他文件中通过声明为 extern 来访问。

5. 使用场景

  • 函数内部:在函数内部定义静态变量通常用于跟踪函数调用的次数或维持函数的状态。
  • 全局变量:作为全局变量定义时,它们在整个程序中是可见的,但只能在定义它们的文件中访问,除非通过 extern 关键字在其他文件中声明。

示例代码

#include <stdio.h>

void count_calls() {
    static int count = 0;  // 静态变量,用于计数函数调用次数
    printf("This function has been called %d times.\n", ++count);
}

int main() {
    count_calls();  // 输出: This function has been called 1 times.
    count_calls();  // 输出: This function has been called 2 times.
    count_calls();  // 输出: This function has been called 3 times.
    return 0;
}
This function has been called 1 times.
This function has been called 2 times.
This function has been called 3 times.
请按任意键继续. . .

在这个例子中,count_calls 函数中的 count 变量是一个静态变量,它用于跟踪函数被调用的次数。每次调用函数时,count 的值都会增加,并且其值在函数调用之间保持不变。

五、你真的认识赋值符号“=”吗?

int a,b,c=4;
a=(b=4)=c;

a=(b=4)=c;这个赋值语句是非法的,不能将常量赋给常量,也就是说等号左边必须是变量才能赋值

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

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

相关文章

20240921全国计算机二级Python考试(大头博士计算二级)

一、背景需求&#xff1a; 20240921我在上海应用技术大学44号楼考场参加2024年9月的全国计算机二级&#xff08;Python语言程序设计&#xff09;考试。 时隔多年&#xff0c;再次来到大学校园&#xff0c;恍若隔世 扫码找考场在哪里 考场须知 1、进考场&#xff0c;先刷身份证…

有关elementui form验证问题,有值却仍然显示不通过

参考链接 有关elementui form验证问题&#xff0c;有值却仍然显示不通过 - 一棵写代码的柳树 - 博客园 需要保证表单上的 :model" "和prop" "对应的属性相同 el-form 绑定数据:model 和 规则:rules input 绑定 数据表单里的数据 其父组件提供校验所绑定的…

Mybatis的XML实现方法

Mybatis的开发有两种方式&#xff1a; 1、注解 2、XML 使用Mybatis的注解方式&#xff0c;主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能&#xff0c;建议使用XML来配置映射语句&#xff0c;也就是将SQL语句写在XML配置文件中。 Mybatis的XML的实现需要以下…

leetcode练习 二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3提示&#xff1a; 树中节点的数量在 [0, 104] 区间内。-100 …

java使用ByteBuffer进行多文件合并和拆分

1.背景 因为验证证书的需要&#xff0c;需要把证书文件和公钥给到客户&#xff0c;考虑到多个文件交互的不便性&#xff0c;所以决定将2个文件合并成一个文件交互给客户。刚开始采用字符串拼接2个文件内容&#xff0c;但是由于是加密文件&#xff0c;采用字符串形式合并后&…

fastadmin 部署后前台会员中心出现404错误

访问前台会员中心出现404错误。 解决&#xff1a;nginx访问站点增加伪静态 location / {if (!-e $request_filename){rewrite ^(.*)$ /index.php?s$1 last; break;} }在phpstydy中增加伪静态&#xff0c;如图&#xff1a;

保姆级教程教你如何安装Hadoop,实现Hadoop单机(非分布式)配置

下载Ubutu镜像 前往阿里镜像站https://mirrors.aliyun.com/oldubuntu-releases/releases/16.04.0/?spma2c6h.25603864.0.0.6be57ff3u2zMGR 选择下载ubuntu-16.04-desktop-amd64.iso 下载时间较久&#xff0c;请耐心等待 创建实验用虚拟机 选择创建新的虚拟机 选择典型并下一…

伊犁-linux 硬盘添加,分区,格式化

主要是linux 下操作硬盘分区&#xff0c;格式化 这样1个sata 盘就添加成功了 &#xff01;  继续添加三块 sata1 hda sata hdb sata hdc sata hdd scsi sda 作为启动盘 进行操作系统的引导 如果scsi 往下调整 先敲enter 在用&#xff0d; 号往下 如果是往上调整敲…

win7自带壁纸丢失主题丢失

有时候盗版破解或者其他美化工具会导致win7自带的壁纸丢失&#xff0c;从个性化管理里面无法恢复原始的壁纸&#xff08;如下图&#xff09;&#xff0c;但是由于工作原因公司的电脑又不方便设置第三方的壁纸&#xff0c;所以找了一下解决方案。 经典问题&#xff0c;百度找到的…

华为全联接大会HUAWEI Connect 2024印象(二):昇腾AI端侧推理

此次参加HUAWEI Connect 2024最主要目标是了解昇腾AI端侧推理技术&#xff0c;希望将其融合到我现在嵌入式系统课程中&#xff0c;不过刚开始在一楼找到一个小展台&#xff0c;看到了香橙派Orange Pi。香橙派是深圳迅龙的一个品牌&#xff0c;他们和很多芯片厂商都合作过&#…

创建Application(Qt)模板项目时的 Base class选择

在Qt中&#xff0c;当你使用Qt Creator新建一个Qt Widgets Application项目时&#xff0c;选择Base class是一个重要的步骤&#xff0c;因为它决定了你的主窗口或对话框将继承自哪个类&#xff0c;从而决定了你的应用程序将具有哪些基本的功能和外观。以下是一些常见的Base cla…

毕业设计选题:基于ssm+vue+uniapp的校园商铺系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

动手学深度学习(李沐)PyTorch 第 1 章 引言

在线电子书 深度学习介绍 安装 使用conda环境 conda create -n d2l-zh python3.8 pip安装需要的包 pip install jupyter d2l torch torchvision下载代码并执行 wget https://zh-v2.d2l.ai/d2l-zh.zip unzip d2l-zh.zip jupyter notebookpip install rise如果不想使用jupyt…

NAT和代理服务

文章目录 NAT和代理服务1、NAT技术背景2、NAT 技术 IP 转换过程3、NAPT4、NAT 技术的缺陷5、代理服务器5.1、正向代理5.1.1、概念5.1.2、工作原理5.1.3、功能特点5.1.4、应用场景 5.2、反向代理5.2.1、概念5.2.2、工作原理5.2.3、应用场景 6、NAT 和代理服务器 NAT和代理服务 …

实景三维+耕地保护:构建耕地资源管理的全闭环新模式

在耕地资源日益珍贵的今天&#xff0c;如何高效、精准地实施耕地保护&#xff0c;成为了我国农业可持续发展与生态文明建设的关键课题。“实景三维耕地保护”的创新模式&#xff0c;能够为这一挑战提供突破性的解决方案&#xff0c;打造一个从前端监测到后端管理的全闭环耕地保…

Global Attention Decoder for Chinese Spelling Error Correction(ACL2021)

Global Attention Decoder for Chinese Spelling Error Correction(ACL2021) 一.概述 作者认为现有的纠错方法大多是基于局部上下文信息进行纠错&#xff0c;没有考虑句子中错词的影响。将注意力放在错误上下文信息上可能会误导并降低CSC(Chinese Spelling Correction)的整体性…

【计算机网络】网络层协议解析

网络层的两种服务IPv4分类编址划分子网无分类地址 IPv4地址应用IP数据报的发送和转发过程主机发送IP数据报路由器转发IP数据报 IPv4数据报首部格式ICMP网际控制报文协议虚拟专用网VPN与网络地址转换NAT 网络层主要任务是实现网络互连&#xff0c;进而实现数据包在各网络之间的传…

快速掌握Matlab R2016a安装,就是这么简单

Matlab R2016a下载方法&#xff1a; Matlab R2016a安装教程&#xff1a; 1、右击下载好的压缩包&#xff0c;选择解压到Matlab R2016a 2、打开文件夹【R2016a_win64】&#xff0c;右击下面的setup.exe&#xff0c;选择【以管理员身份运行】 3、点击选择【使用文件安装密钥】&a…

2024华为杯研究生数学建模,代码思路和参考文章

F题X射线脉冲星光子到达时间建模&#xff0c; E题高速公路应急车道紧急启用模型&#xff0c; D题大数据驱动的地理综合问題&#xff0c; C题数据驱动下磁性元件的磁芯损耗建模&#xff0c; B题W LAN 组网中网络吞吐量建模&#xff0c; A题风电场有功功率优化分配&#xff…

ProtoBuf序列化框架介绍

文章目录 ProtoBuf介绍使用流程 QUICK START创建.proto文件注释语法编译部分代码展示使用接口运行结果 ProtoBuf介绍 ProtoBuf全称是Protocol Buffer&#xff0c;是一个数据结构的序列化和反序列化框架 他又很多好处&#xff0c;首先是他支持跨平台&#xff0c;支持Java、C、…