格式化输入输出

跟着肯哥(不是我)学格式化输入输出

C语言格式化输入

在C语言中,格式化输入(Formatted Input)是一种从标准输入读取数据并按照指定格式进行解析的操作,它主要通过使用标准库函数scanf()来实现格式化输入。

格式化输入规则

这没什么好说的,搬运自讲义

scanf()函数使用格式控制字符串来指定输入的格式,包括要读取的数据类型和数据的排列方式。以下是一些常用的格式控制符:

  • %d:读取有符号整数
  • %ld:读取有符号长整数
  • %u:读取无符号整数
  • %lu:读取无符号长整数
  • %f:读取单精度浮点数
  • %lf:读取双精度浮点数。
  • %c:读取字符
  • %s:读取字符串
  • %x:读取十六进制(小写字母)整数
  • %X:读取十六进制(大写字母)整数
  • %o:以八进制形式读取无符号整数
  • %e:以指数形式读取单、双精度实数
  • %p:读取一个指针的地址,与%x和%lx类似
  • %%:读取百分号字符

格式化输入操作对输入数据格式要求严格,如果输入的数据与格式求不匹配,或者输入中包含了无效字符,可能会导致解析错误。

这就要求我们在使用格式化输入时,需要保证输入数据符合指定的格式,或者进行错误处理以防止程序崩溃或产生未定义的行为。
scanf()函数会跳过输入中的空白字符(如空格、制表符、换行符等),直到找到匹配的空白字符为止。这意味着在使用scanf()函数读取输入之前,可能需要清除输入缓冲区中的残留字符,以确保输入的准确性。通常我们会使用getchar()fflush(stdin)函数来清除缓冲区。
scanf输入数据的存放时,一定是存放在一个对应数据类型的内存空间,所以体现在scanf的函数传参就是带&符合的地址。如果传入的是变量,而不是它的地址,可能会产生不可预知的错误。

C语言格式化输出

还是老生常谈的东西,也没什么好说的,搬运自讲义

C语言中,格式化输出(Formatted Output)是一种按照指定格式将数据打印到标准输出或者其他输出设备的操作,它主要通过使用标准库函数printf()来实现格式化输出。

  • %d:输出有符号整数
  • %ld:输出有符号长整数
  • %u:输出无符号整数
  • %lu:输出无符号长整数
  • %f:以小数形式输出单精度、双精度浮点数
  • %c:输出单个字符
  • %s:输出一个字符串
  • %x:输出十六进制(小写字母)整数
  • %X:输出十六进制(大写字母)整数
  • %o:以八进制形式输出无符号整数(不输出前缀0)
  • %e:以指数形式输出单、双精度实数
  • %p:输出一个指针的地址,与%x和%lx类似
  • %%:输出百分号字符

此外,这些格式化控制符可以与其他修饰符一起,以便实现更多的输出控制。

以下是一些常用的修饰符:

  • %-:左对齐输出
  • %+:显示正数的正号
  • %0:用零填充字段宽度
  • %*:从参数中获取字段宽度或精度
  • %n:将已打印字符的数量存储到中 (比较少见)

格式化输出是将数据以人类可读的方式呈现给用户,方便查看和理解。

合理运用格式化输出可以使输出结果更具可读性,并且方便调试和展示程序的运行结果。

C语言变参函数

这个我用的少,但很想接触。很少有资料讲过

在C语言中,变参函数(Variadic Function)是一种能够接受可变数量的参数的函数。它允许我们定义一个函数,在调用时可以传入不定数量的参数。

在C语言中,使用标准库函数stdarg.h中的一组宏来支持变参函数的实现。主要的宏有以下三个:

  • va_list:变量类型,用于存储可变参数列表。
  • va_start:宏,用于初始化可变参数列表。
  • va_arg:宏,用于访问可变参数列表中的参数。
  • va_end:宏,用于结束变参的处理。

讲义的示例代码

c 复制代码
#include <stdio.h>
#include <stdarg.h>

double average(int count, ...) {
   double sum = 0;
   int i;

   va_list arglist;
   va_start(arglist, count);

   for (i = 0; i < count; i++) {
       double num = va_arg(arglist, double);
       sum += num;
   }

   va_end(arglist);

   return sum / count;
}

int main() {
   double avg1 = average(3, 1.0, 2.0, 3.0);
   double avg2 = average(5, 1.5,2.5, 3.5, 4.5, 5.5);

   printf("平均值1 %lf\n", avg1);
   printf("平均值2: %lf\n", avg2);

   return 0;
}
相关推荐
倒头就睡的小比特11 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!12 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼13 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光14 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark14 小时前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her114 小时前
并查集-听课笔记
笔记·算法·并查集
码流子14 小时前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven15 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark15 小时前
从算法设计模式看编程思维的抽象能力4
算法
2601_9622186115 小时前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法