C语言学习【printf函数和scanf函数】

news2024/9/22 7:33:03

C语言学习【printf函数和scanf函数】

printf()函数和scanf()函数可以让用户与程序交流,是输入/输出函数

printf()函数

请求printf()函数打印数据的指令要与待打印数据的类型相匹配。例如,打印整数时使用%d,打印字符时使用%c。这些符号被称为转换说明(conversion specification),它们指定了如何把数据转换成可显示的形式

如下图所属我i欸转换说明及其打印的输出结果

/* 使用转换说明 */
#include "stdio.h"
#define PI 3.1415926

int main(void)
{
    int number = 7;
    float pies = 12.75;
    int cost = 7800;

    printf("The %d contestants ate %f berry pies.\n", number, pies);
    printf("The value of pi is %f.\n", PI);
    printf("Farewell! thou art too dear for my possessing, \n");
    printf("%c%d\n", '$', 2 * cost);
}

程序运行结果

The 7 contestants ate 12.750000 berry pies. 
The value of pi is 3.141593.
Farewell! thou art too dear for my possessing, 
$15600

printf()函数格式为

printf(格式字符串, 待打印项 1, 待打印项 2,...);

printf()输出百分号:使用两个%即可

/* printf 输出 % */
#include "stdio.h"

int main(void)
{
    int radio = 12;
    printf("%d%%", radio);
}

程序运行结果

12%

printf()的转换说明修饰符

下图所示为printf()的修饰符

printf()中的标记

使用修饰符和标记的示例程序(字段宽度打印输出整数时的效果)

/* 字段宽度 */
#include "stdio.h"

#define PAGES 959

int main(void)
{
    printf("*%d*\n", PAGES);
    printf("*%2d*\n", PAGES);
    printf("*%10d*\n", PAGES);
    printf("*%-10d*\n", PAGES);

}

程序运行结果

*959*
*959*
*       959*
*959       *

第一个转换说明%d不带任何修饰符,其对应输出结果与带整数字段宽度的转换说明的输出结果相同;
第二个转换说明是%2d,其对应的输出结果应该该是2字段度。因为待打印的整数有3位数字,所以字段宽度自动扩大以符合整数的长度;
第3个转换说明是%10d,其对应的输出结果有10个空格宽度,实际上在两个星号之间有7个空格和3位数字,并且数字位于字段的右侧;
最后一个转换说明是%-10d,其对应的输出结果同样是10个空格宽度,-标记说明打印的数字位于字段的左侧.

浮点型格式效果

/* 一些浮点型修饰符的组合 */

/* 一些浮点型修饰符的组合 */

#include "stdio.h"

int main(void)
{
    const double RENT = 3852.99;     /* const 常量 */

    printf("*%f*\n", RENT);                  /* 字段宽度和小数点文书均为系统默认 小数点后打印6位数字 */
    printf("*%e*\n", RENT);                  /* %e 编译器在小数点左侧打印一个数字 小数点右侧打印6个数字 */
    printf("*%4.2f*\n", RENT);               /* */
    printf("*%3.1f*\n", RENT);
    printf("*%10.3f*\n", RENT);
    printf("*%10.3E*\n", RENT);
    printf("*%+4.2f*\n", RENT);              /* +代数标记 */
    printf("*%010.2f*\n", RENT);             /* 补齐方式 */
}

程序运行结果

*3852.990000*  
*3.852990e+003*
*3852.99*
*3853.0*
*  3852.990*
*3.853E+003*
*+3852.99*
*0003852.99*

其他组合

/* 演示一些格式标记 */

#include "stdio.h"

int main(void)
{
    printf("%x %X %#x\n", 31, 31, 31);
    printf("**%d**% d**% d**\n", 42, 42, -42);
    printf("**%5d**%5.3d**%05d**%05.3d**\n", 6, 6, 6, 6);

}

程序运行结果

1f 1F 0x1f
**42** 42**-42**
**    6**  006**00006**  006**

第1行输出中,1f是十六进制数,等于十进制数31,第1行 printf()语句中,根据%x打印出1f%F打印出1F%#x打印出0x1f
第 2 行输出演示了如何在转换说明中用空格在输出的正值前面生成前导空格,负值前面不产生前导空格。这样的输出结果比较美观,因为打印出来的正值和负值在相同字段宽度下的有效数字位数相同;
第 3 行输出演示了如何在整型格式中使用精度(%5.3d)生成足够的前导 0 以满足最小位数的要求(本例是 3)。然而,使用 0 标记会使得编译器用前导 0 填充满整个字段宽度。最后,如果 0 标记和精度一起出现,0 标记会被忽略。

字符串格式的示例

/* 字符串格式 */

#include "stdio.h"

#define BLURB "Authentic imitation!"

int main(void)
{
    printf("[%2s]\n", BLURB);
    printf("[%24s]\n", BLURB);
    printf("[%24.5s]\n", BLURB);
    printf("[%-24.5s]\n", BLURB);
}

程序运行结果

[Authentic imitation!]    
[    Authentic imitation!]
[                   Authe]
[Authe                   ]

-标记使得文本左对齐输出.

转换(conversion)说明的意义

76在计算机内部的存储格式为二进制数0100 1100%d转换说明将其转换成字符76,并显示为76%x转换说明把相同的值0100 1100转化成十六进制计数法4c%c转换说明把0100 1100转换成字符L

转换说明应该与待答应值得类型相匹配

以下是一些不匹配的整型转换示例

/* 一些不匹配的整型转换 */
#include "stdio.h"

#define PAGES 336
#define WORDS 65618

int main(void)
{
    short num = PAGES;
    short mnum = -PAGES;

    printf("num as short and unsigned short: %hd %hu\n", num, num);
    printf("-num as short and unsigned short: %hd %hu\n", mnum, mnum);
    printf("num as int and char: %d %c\n", num, num);
    printf("WORDS as int, short, and char: %d %hd %c\n", WORDS, WORDS, WORDS);

}

程序运行结果

num as short and unsigned short: 336 336
-num as short and unsigned short: -336 65200
num as int and char: 336 P
WORDS as int, short, and char: 65618 82 R

%u表示无符号;
short int的大小是2字节;系统采用二进制补码来表示有符号整数;数字0~32767代表它们本身,而32768~65535则表示负数,其中65535表示-1,依此类推.

当 printf()使用%c 打印 336 时,它只会查看储存 336 的 2 字节中的后 1 字节
用%hd 转换说明打印时,printf()只使用最后 2 个字节


混淆整型和浮点型

/* 不匹配的浮点型转换 */

#include "stdio.h"

int main(void)
{
    float n1 = 3.0;
    double n2 = 3.0;
    long n3 = 2000000000;
    long n4 = 1234567890;

    printf("%.1e %.1e %.1e %.1e\n", n1, n2, n3, n4);
    printf("%ld %ld\n", n3, n4);
    printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);

}

程序运行结果

3.0e+000 3.0e+000 9.9e-315 6.1e-315
2000000000 1234567890
0 0 2000000000 1234567890

第1 行输出显示,%e转换说明没有把整数转换成浮点数;
float 类型的值作为 printf()参数时会被转换成 double 类型。
在本系统中,float 是 4 字节,但是为了 printf()能正确地显示该值,n1 被扩成 8 字节

参数传递

栈(stack)

printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);

n1 被储存在栈中,占 8 字节(float 类型被转换成 double 类型)。同样,n2 也在栈中占 8 字节,而 n3 和 n4 在栈中分别占 4 字节;
%ld 转换说明表明 printf()应该读取 4 字节

printf()函数的返回值

printf()函数也有一个返回值,它返回打印字符的个数。如果有输出错误,printf()则返回一个负值

/* printf()的返回值 */

#include "stdio.h"

int main(void)
{
    int bph2o = 212;
    int rv;

    rv  =printf("%d F is water's boiling point.\n", bph2o);

    printf("The printf() function printed %d characrters.\n", rv);

    return 0;
}

程序运行结果

212 F is water's boiling point.
The printf() function printed 32 characrters.

在字符串中,可以使用\n 来表示换行字符,但是不能通
过按下 Enter(或 Return)键产生实际的换行符。

打印较长字符串的方法

/* 打印较长字符串 */

#include "stdio.h"

int main(void)
{
    printf("Here's one way to print a ");
    printf("long string.\n");

    printf("Here's another way to print a \
    long string.\n");
    printf("Here's the newest way to print a "
        "long string.\n");        /* ANSI C */

    return 0;
}

程序运行结果

Here's one way to print a long string.        
Here's another way to print a     long string.
Here's the newest way to print a long string. 

示例二

/* 打印较长字符串 */

#include "stdio.h"

int main(void)
{
    printf("Hello, young lovers, wherever you are.\n");
    printf("Hello, young"    " lovers" ", wherever you are.\n");
    printf("Hello, young lovers" 
        ", wherever you are.");

}

程序运行结果

Hello, young lovers, wherever you are.
Hello, young lovers, wherever you are.
Hello, young lovers, wherever you are.

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

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

相关文章

Invalid bound statement (not found) 六种解决方法

前五种参考博文: Invalid bound statement (not found) 五种解决方法-CSDN博客 第六种: 在启动类上加上MapperScan,指定扫描包

day08|字符串题目part01

相关题目: ● 344.反转字符串 ● 541. 反转字符串II ● 卡码网:54.替换数字 ● 151.翻转字符串里的单词 ● 卡码网:55.右旋转字符串 344.反转字符串—双指针的应用 力扣链接 思路:创建两个指针分别指向头部和尾部,首…

IP代理中的SOCKS5代理是什么?安全吗?

在互联网世界中,网络安全和个人隐私保护变得日益重要。SOCKS5代理作为一种安全高效的网络工具,不仅可以保护个人隐私安全,还可以提供更稳定、更快度的网络连接。本文将带大家深入了解SOCKS5代理在网络安全领域中的应用。 什么是SOCKS5代理 …

vue3.0+antdv的admin管理系统vue-admin-beautiful推荐

前言 几年前,笔者自学了vue这一优秀的前端框架,但苦于没项目练手,无意间发现了vue-admin-beautiful这一优秀的前端集成框架。当时就使用它做了一很有意思的小项目---终端监控云平台,实现了前端和后台的整体功能。整体方案介绍参见…

python:SunMoonTimeCalculator

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看: # 描述: https://github.com/Broham/suncalcPy # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 3.11 # Datetime : 2024/5/14 21:59 # User …

在抖音做电商,没有货源,不懂直播怎么办?分享一种解决方案!

大家好,我是电商糖果 糖果做电商的时间也挺久了,天猫,京东,闲鱼都搞过。 从学校进入社会工作,创业,一直都是围绕电商打转。 做的时间久了,好像只会做这一件事儿了。 2020年开始专攻抖音小店&…

大模型日报2024-05-15

大模型日报 2024-05-15 大模型资讯 OpenAI推出全新AI模型GPT-4o,具备文本、图像和音频处理能力 摘要: OpenAI公司继ChatGPT后,最新推出了名为GPT-4o的AI模型。这一模型不仅能够理解和生成文本,还新增了图像和音频的解释及生成功能。GPT-4o作为…

思科模拟器--2.静态路由和默认路由配置24.5.15

首先,创建三个路由器和两个个人电脑。 接着,配置两台电脑的IP,子网掩码和默认网关 对Router 0,进行以下命令: 对Router进行以下命令: 对Router2进行以下命令: 本实验完成。 验证:PC…

代码随想录训练营Day 29|力扣39. 组合总和、40.组合总和II、131.分割回文串

1.组合总和 题目链接/文章讲解: 代码随想录 视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!_哔哩哔哩_bilibili 代码:(未剪枝版 &#xf…

React Native 之 原生组件和核心组件(二)

原生组件 在 Android 开发中是使用 Kotlin 或 Java 来编写视图;在 iOS 开发中是使用 Swift 或 Objective-C 来编写视图。在 React Native 中,则使用 React 组件通过 JavaScript 来调用这些视图。在运行时,React Native 为这些组件创建相应的 …

19个测试⽤例⽣成的AI⼯具!卷起来!

在不断发展的软件开发领域中,确保应⽤程序的可靠性和功能性⾄关重要。 随着软件系统复杂性的增加,有效测试⽅法的需求也在上升。 传统的测试⽤例⽣成⽅法通常⽆法满⾜快速开发周期和复杂代码库的需求。 随着进⼊⼈⼯智能(AI)时…

ROS学习笔记(15)小车巡墙驾驶

0.前提 前一章我讲解了拉氏变换和PID,这一章我来讲解一下小车巡墙驾驶的理论和部分代码。 1.前情回顾 1.拉氏变换 拉普拉斯变换是要将时域问题转换成频域问题来处理。 2.PID控制器 转向角: 误差牺牲: 3.具体参看上一篇文章 2.巡墙驾驶…

机器学习入门介绍

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 目录 三大方向机器学习产生的原因机器如何学习…

Vue3学习笔记 - 禹神YYDS

1. 教程介绍 https://www.bilibili.com/video/BV1Za4y1r7KE?p1 本篇vue3,内容比较新,比如有setup语法糖用法;只是他使用TS,并不是JS;不过JS也比较熟悉了,也可以学习下TS的语法,课程使用 TypeSc…

【利用数组处理批量数据-谭浩强配套】(适合专升本、考研)

无偿分享学习资料,需要的小伙伴评论区或私信dd。。。 无偿分享学习资料,需要的小伙伴评论区或私信dd。。。 无偿分享学习资料,需要的小伙伴评论区或私信dd。。。 完整资料如下:纯干货、纯干货、纯干货!!…

再谈毕业论文设计投机取巧之IVR自动语音服务系统设计(信息与通信工程专业A+其实不难)

目录 举个IVR例子格局打开,万物皆能IVR - 把《民法典》搬上IVR IVR系统其实可盐可甜。还能可圈可点。 戎马一生,归来依然IVR。 举个IVR例子 以下是IVR系统的一个例子。 当您拨打电话进入IVR系统。 首先检验是否为工作时间。 如是,您将被送入…

STM32F407 2个高级定时器生成2路无刷电机波形以及相电流采集程序(寄存器版)

stm32f407 高级定时1、定时8 生成20k 中心PWM 波形 并分别用其通道4 触发ADC1 ADC2 采样 用于分别两无刷电机foc 电流环控制,ADC1产生50us的电流采集完成中断,用于foc算法周期运算 主要参考高级定时器的寄存器和ADC寄存器 首先,要使用STM32F…

OSG编程指南<二十三>:基于OSG+ImGui制作模型编辑器,实现三轴方向的实时平移、旋转和缩放变化

1、概述 在OSG的开发应用过程中,我们有时候总会纠结于使用MFC还是Qt来嵌入OSG窗口以便于后续的功能开发,毕竟选择一个合适的UI框架,对于后续的开发还是省去很多麻烦的。但对于初学者来说,可能对框架消息机制的不熟悉,尤…

每日复盘-20240515

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 国联证券 (1)|[9:25]|[133765万]|31.12 一…

selenium发展史

Selenium Core 2004 年,Thoughtworks 的工程师 Jason Huggins 正在负责一个 Web 应用的测试工作,由于这个项目需要频繁回归,这导致他不得不每天做着重复且低效的工作。为了解决这个困境,Jason 开发了一个运行在 JavaScript 沙箱中…