C语言 基本输入输出函数

article/2025/10/30 20:39:27

1 几组常见的输入输出函数

在stdio.h头文件中内置了几种输入输出函数,如下列出:

  • printf 与 scanf
  • getchar 与 putchar
  • gets 与 puts

相比之下 printf 与 scanf的功能最为强大,但操作稍显复杂,后两种则功能简单,但针对性较强。


2 printf函数

功能:按照规定格式输出指定数据

2.1.一般形式:如图

这里写图片描述

格式控制:由“%”后跟格式字符组成。将输出数据转换为指定格式输出,字符串原样输出,转义字符对输出形式进行控制。

2.2.格式说明

这里写图片描述

附加格式说明字符说 明
-输出的数字或字符以左对齐,右边填空格
0(数字)输出的空位用0填充。
m(一个正整数)输出数据的字段宽度。如果实际位数多于m,按实际位数输出;如果实际位数少于m,则补以空格或0。
.n(一个正整数)对实数,表示输出n位小数;对字符串,表示截取的字符个数。
l(字母)输出长整型整数

2.2.1常见格式输出

%d —— 以带符号的十进制形式输出整数
%o —— 以无符号的八进制形式输出整数
%x —— 以无符号的十六进制形式输出整数
%u —— 以无符号的十进制形式输出整数
%c —— 以字符形式输出单个字符
%s —— 输出字符串
%f —— 以小数点形式输出单、双精度实数
%e —— 以标准指数形式输出单、双精度实数
%g —— 选用输出宽度较小的格式输出实数

2.3 %d格式符

格式: %[-][0][m][l]d

说明:

  • %d 按整型数据的实际长度输出。

  • %[0]md 以m指定的字段宽度输出,如果数据的位数小于m,则左端补以空格;若m前面有“0”,则左端补以0。

  • %-md 以m指定的字段宽度输出,左对齐。

  • %ld 输出长整型数据。

2.4 %c格式符

格式:%[m]c

说明:输出一个字符。输出数据可以是单个字符,或一个范围在0~255之间的整数。

例:

#include <stdio.h>
main( )
{   char x=‘a’;  int i=98;printf("%c,%d\n",x,x);printf("%c,%d\n",i,i);
}// output
a,97
b,98

2.5 %s格式符

格式:%[-][m][.n]s

说明:

  • %s 直接输出指定字符串。

  • %ms 输出字符串占m列,右对齐。m小于字符串长度时原样输出,大于字符串长度时不足补空格,下同。

  • %-ms 输出字符串占m列,左对齐。

  • %m.ns 输出字符串前n个字符,占m列,右对齐。

例:

#include<stdio.h> void main(){printf("%3s,%-6s,%-5.2s,%4.3s,%.3s,","hello", "hello","hello","hello","hello");
}
输出结果:
hello,hello ,he   , hel,hel,

2.6 %f格式符

格式: %[-][0][m][.n][l]f

说明:

  • %f 整数部分全部输出,小数部分输出6位(四舍五入)。

  • 0 右边补0满足小数位数,或左边补0满足m列

  • %m.nf 输出数据共占m列,小数占n位,右对齐。只有m时,当m大于字符串长度则需补足m列,当m小于字符串长度则与%f同

  • %-m.nf 输出数据共占m列,小数占n位,左对齐。

  • %lf 以双精度输出

例:

#include<stdio.h> void main(){float f=3.14159;printf("%f,%07.3f,%-7.3f,%10f,%.3f,",f,f,f,f,f);
}  // output:
3.141590,003.142,3.142  ,  3.141590,3.142,

2.7 %e格式符

格式:%[-][0][m][.n]e

说明:

  • %e:输出数据共占13位,其中整数部分为1位非零数字,小数点占1位,小数部分为6位,指数部分e占1位,指数符号占1位,指数为3位。若输出数据为负数,还应增加一位整数部分的符号位。

  • %m.ne 输出占m列,小数位为n项(四舍五入)。m小于输出宽度时原样输出,大于输出宽度时补足空位

  • –设置左对齐

如下图
这里写图片描述

例:

#include<stdio.h> void main(){printf("\n,%10.1e",31.5);
}
// output
,  3.2e+001

2.8 %o、%x和%u格式符

格式: %[-][0][m][l]o(x或u)

说明:
将内存单元中的二进制数(包括符号位)直接转换成八进制数、十六进制或十进制数输出。

  • %o 输出无符号八进制
  • %x 输出无符号十六进制
  • %u 输出无符号十进制

例:

#include<stdio.h> void main(){int i=-1;printf("\n%d,%o,%x,%u",i,i,i,i);
}// output
-1,37777777777,ffffffff,4294967295

例:

#include<stdio.h> void main(){unsigned char ch1 = 255; // 1111 1111  ,1字节char ch2 = -128;// %hh 限定了字符为8位一个字节 // %hhd 有符号十进制字符型 %hhu 无符号十进制字符型printf("\n\n%hhd,%hhu,%hho,%hhx",ch2,ch1,ch1,ch1);//128,255,377,ff// %h 限定了16位2个字节     unsigned short sh1 = 65535; // 1111 1111 1111 1111 ,2字节short sh2 = -32767; printf("\n%hu,%hd,%ho,%hx",sh2,sh1,sh1,sh1);  // 32769,-1,177777,ffff// %l 限定了32位4个字节 unsigned long ulong = 4294967295; //1111 1111 1111 1111 1111 1111 1111 1111  ,4字节long slong = -2147483647;printf("\n%ld,%lu,%lo,%lx",slong,ulong,ulong,ulong); // -2147483647,4294967295,37777777777,ffffffff// %ll 限定了64位8个字节 unsigned long long ull= 4294967295;long long ll = -2147483647;printf("\n%lld,%llu,%llo,%llx",ll,ull,ull,ull);  // -2147483647,4294967295,37777777777,ffffffff// %e指数输出long double lb = 198888888888;printf("\n%Lf,%Le,%Lo,%Lx,%Lg",lb,lb,lb,lb,lb);  // 0.000000,5.180393e-317,47776740,9ffdd0,5.18037e-317printf("\n%La,%LA",lb,lb); // 输出十六进制的指数形式  0x0.000000p-1022,0X0.000000P-1022
}

2.9 %g格式符

根据数值的大小,自动选择用f格式或e格式输出实数。输出时选择占宽度较小的一种,且不输出无意义的零。

例:

#include<stdio.h> void main(){float f=3.14159;printf("\n%e,%f,%lf,%g",f,f,f,f);
} 
// output
3.141590e+000,3.141590,3.141590,3.14159

2.10 使用printf的注意事项

  • 不同类型的数据应使用相应类型的格式字符说明其输出形式,以保证显示结果符合预期。

  • 格式字符中,除了X、E、G外,其他均用小写字母,如“%d”不能写成“%D”。

  • 如需输出双引号,应在“格式控制”中表示为转义字符的形式并用单引号引起来,即“\””。

  • 如需输出字符“%”,在“格式控制”中用连续两个“%”即可。
    如:printf(“%d%%”,10);

  • 当“格式控制”中格式符个数少于输出表中的输出项时,多余的输出项不予输出。

  • 当“格式符”多于输出项时,多出的格式符输出结果为不定值。


3 scanf函数

与printf函数一样,scanf函数也是遵守格式化(format)原则,所谓格式化,是该函数预先给程序员定义了一批输入格式,程序员可以选择其中的某些格式,遵守这些格式,scanf函数就可以按照指定的格式来接收键盘的输入数据了。

scanf函数只能在控制台程序中使用,有窗口的界面程序无法通过scanf接收按键。当控制台中出现闪烁的光标时,表示程序在等待用户输入数据。在控制台程序中,一般以回车键代表数据输入完毕,下达命令,指示程序开始工作。scanf函数可以接收多个任意类型的数据,但需严格遵守format格式,否则会出错。

3.1 一般形式:如图

这里写图片描述

功能:要求用户从键盘上输入指定格式的数据。
说明:如果数据不止一个,应在数据之间用一个或多个空格间隔,也可以用回车键或跳格键tab间隔。

3.2 scanf格式控制

格式控制

格式符说明
d用于输入十进制整数
o用于输入八进制形整数
x用于输入十六进制整数
c用于输入一个字符
s用于输入字符串,并将字符串送到一个字符数组中。输入时以非空白字符开始, 第一个空白字符结束。字符串以串结束标志“\0”作为其最后一个字符。
f用于输入实数。输入时用小数点形式或指数形式均可。(输入双精度必须用%lf,否则不能正常输入)
e与f作用相同

附加格式

格式字符说明
*表示本输入项在输入后不赋给相应的变量。(不存储)
l(字母)用于输入长整型和双精度实型数据
m(一个正整数)用于输入长整型和双精度实型数据

3.3 scanf函数的格式字符串的组成

  • 格式符
    和printf函数类似,scanf函数的格式字符串以%开始,以一个格式字符结束,中间可以插入附加字符。格式符告诉了scanf函数该读取什么样的数据。

  • 空白符
    空白符可以是空格(space,用空格键输入)、制表符(tab,用Tab键输入)和新行符(newline,用回车键输入),或者它们的组合

  • 非空白符
    除去格式说明符合空白符之外,就是非空白符。非空白符在用户输入的时候,也必须一并输入。非空白符使scanf() 在缓冲区中读一个匹配的字符并将这个字符忽略。例如,”%d,%d”使scanf()先读入一个整数,接着必须要读入一个逗号,读入到逗号后,表示格式匹配,将读入的逗号丢弃,而不像读入的整数存储到某个内存空间。读入逗号后,接着读入另一个整数。如发现不能匹配格式字符串,比如没有读到逗号,scanf()返回,读入失败。

3.4 使用scanf注意事项

  • 1)注意变量表列中,应该是变量的地址。变量的地址通过求地址符&得到。所以在写代码时千万不要遗漏&符号。

  • 2)如果格式字符串中有非空白字符,也就是除了格式控制字符和空白字符之外的字符,则用户在输入的时候一定也要输入这些字符。否则将出现不匹配格式控制字符串的情况。为了使用户正确输入,编程时一定要考虑到用户是否清楚如何输入,最好在需要用户输入前提示如何输入的格式。

  • 3)在用%c格式符时,空格字符和转义字符都被当作有效字符输入

  • 4)以回车作为下达开始解析命令。整个输入以回车结束。

    如果输入的数据满足了scanf对需要,则输入结束,如果回车后数据不够,则回车只当作一个空白符。

  • 5)scanf解析数据,下列情况认为解析出来一个数据:

    读入非字符型数据时,遇到空白字符。有宽度指示时,读入到相应的宽度。如%4d,则只解析4个数字即认为读入这个整数完毕。

  • 6) 读取双精度double浮点数时,最好使用%lf输入,使用%f可能会导致精度损失甚至读取失败。

3.5 scanf使用示例

// 1)可以指定输入的数据所占据的字符个数,scanf函数自动按照指示截取所需长度的数据。如:int i,j;scanf("%3d%3d",&i,&j);  // 输入:1234567↙printf("%d,%d",i,j);  // 输出  123,456// 2)%后面的*格式符,用来表示在解析时,将读入的数据忽略不赋给任何变量。如:int i,j;scanf("%d %*d %d",&i,&j); // 输入: 123 456 789 printf("%d,%d",i,j);    // 输出: 123,789
// 3)输入数据时不能指定精度。如:float f;scanf("%7.2f",&f); // 输入 123.456 printf("%f23",f); // 输出 0.00000023 
// 4) 输入双精度数使用%lf// 输入双精度浮点数时,务必用%lf,如下错误double db;scanf("%f",&db);  //输入: 123.456printf("%f",db); // 输出 : 0.000000 

4 字符输入输出(getchar/putchar)

有些时候,仅仅为了在显示器屏幕上打印或从控制台获取一个字符,此时使用功能强大的printf与scanf函数,则显得过于繁琐,C提供了一个库函数putchar/getchar来完成这个简单的任务。

4.1 putchar

putchar 函数是字符输出函数, 其功能是在显示器上打印单个字符。putchar函数是一个标准的C语言库函数,它的函数原型在头文件“stdio.h”中。

1 putchar函数的一般格式:

putchar(字符数据);

其中的putchar是函数名称。

2 可以输出的字符类型:

  • 1)字符数据可以是一个字符型变量,如:char c_var= ‘a’; putchar(c_var);

  • 2)字符数据也可以是一个字符常量,如putchar(‘a’);输出结果:a

  • 3)字符数据还可以是一个整数。整数可以是十进制整数,如:putchar(97);输出结果:a

  • 4)字符数据还可以是一个表达式,只要结果是255以内的整数即可。如:
    putchar(‘a’+25);输出结果:z

  • 5)字符数据可以是转义字符。如:
    putchar(‘\n’);结果输出一个换行。putchar(‘\007’); 输出一个提示音

4.2 getchar

这个函数和前面介绍的putchar函数刚好相反。

getchar 函数是得到字符输入函数,其功能是得到用户输入的一个字符。getchar函数是一个标准的C语言库函数,它的函数原型在头文件“stdio.h”中。

getchar函数的一般格式是:

char ch;
ch=getchar();

用户输入的字符就赋给了ch变量。如:

char ch;
ch=getchar();  // 获取输入的字符
printf("%c",ch);

5 字符串输入输出函数 (gets与puts)

5.1 puts

puts函数功能非常单一,在显示器屏幕上输出一个字符串,并换行。

一般形式:

puts(字符串);

如:

puts("你好啊~");
输出结果:
你好啊~

5.2 gets

gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。此函数在stdio.h头文件中定义的。

功能

    从stdio流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。 

返回值

    读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。 

示例

    #include <stdio.h>   void main(void){char buf[20];  //不要char*p,然后gets(p),这是错误的,因为p没有指向有效的内存,它可能指向任何非法地址 ,造成非法访问异常                 gets(buf);printf("%s\n", buf);}

与gets/puts类似的还有fgets与fputs,它们一般用于对文件的操作。关于fgets与fputs的用法案例可以参考C语言学习笔记之文件的分割与合并


后记: 此篇为总结篇,回顾之前的基础知识,留个印记。欢迎交流学习~


http://chatgpt.dhexx.cn/article/WZPD8KkI.shtml

相关文章

C语言的输出和输入

一、输出 printf 函数被成为格式输出函数&#xff0c;是按照用户指定的格式&#xff0c;把指定的数据显示到显示屏上。 printf 函数调用形式为&#xff1a;printf ("格式控制字符串"&#xff0c;输出表列)&#xff1b; 格式控制字符串可分为格式字符串和非格式字符串…

C语言数据输入与输出

1.输入与输出举例 例一&#xff1a;求abxc0方程的根。a,b,c由键盘输入&#xff0c;设-4ac>0 编写程序&#xff1a; 结果输出&#xff1a; 注&#xff1a;1.输入输出是以计算机主机为主体而言的. 2.C语言本身不提供输入输出语句。 3.要在程序文件的开头用预处理指令#includ…

C语言的输入、输出

C语言的输入与输出 一、scanf() 和 printf() 函数实例运行结果 二、getchar() 和 putchar() 函数实例1运行结果实例2运行结果 三、gets() 和 puts() 函数实例运行结果 一、scanf() 和 printf() 函数 实例 #include <stdio.h>int main() {char a[100];printf("Plea…

C语言中的输入和输出

一、数据的输入 在C语言中&#xff0c;有三个函数可以从键盘获得用户输入 getchar&#xff1a;输入单个字符&#xff0c;保存到字符变量中 gets&#xff1a;输入一行数据&#xff0c;保存到字符串变量中 scanf&#xff1a;格式化输入函数&#xff0c;一次可以输入多个数据&…

C语言详解-输入输出

1. 输入输出一览 以下输入输出库函数的操作主要在标准输入输出设备&#xff08;键盘和屏幕&#xff09;与数据缓冲区之间进行。 1.1 printf()与scanf () printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。 注意宽度输出和精度输出控制 scanf(): 从标准输入设备(键盘…

None、Null与空字符‘‘什么区别

1. None 表示空无一物&#xff0c;啥也没有存储。 编程语言里采用None 比如在python中None不是一个保留关键字&#xff0c;只是NoneType对象的一个实例。 空就是空&#xff0c;它不是整型&#xff0c;不是浮点型&#xff0c;也不是字符串&#xff0c;就是一个NoneType。所以在…

关于“空”string字符串

string a ""; string b ""; string c string.Empty; string d string.Empty; string e null; string f null;等运行完后在即时窗口中用&命令查看这些变量的地址 然后发现&#xff0c;所有变量的栈地址都不同&#xff08;废话&#xff09;&#x…

空字符串、NULL、空格串的区别

1、表示区别 string str1 ""; //空字符串 str1.length() 等于 0 string str2 null; //NULL string str3 " "; //空格串 str2.length() 等于 1 2、内存区别 "" &#xff1a;分配了内存 &#xff0c;分配了一个空间 null…

如何输入带空格的字符串

转载自&#xff1a;https://www.cnblogs.com/houchen/p/10356396.html 问题一&#xff1a;带空格的字符串输入(c) 对于string类 getline(cin, str) 对于字符数组 方法一&#xff1a;getline() 读入整行数据&#xff0c;使用回车键输入的换行符来确定输入结尾。 调用方法&am…

C++ 空字符

C 空字符 本来想定义一个空的字符&#xff0c;想当然的就写成了下面的样子&#xff1a; #include <iostream>using namespace std; int main() {char ch ;cout<<ch<<endl;return 0; } 运行直接报错 加上\0 就对了 &#xff0c; 哎 基础呀。。。。。 #i…

【Java】Java中空字符的写法

首先要明确空字符和空格字符的区别 空字符表示数据为空&#xff1b; 空格字符表示数据不为空&#xff0c;为一个空格字符。 Java和C中使用\0表示空字符&#xff0c;Python使用表示空字符。 public class Test {public static void main(String[] args) {char s[] new char[…

MySQL中的空值 Null 和空字符‘‘

目录 1. 空值 Null 和空字符 2. 空值 Null 和空字符 在查询方式上的对比2.1. 创建 SQL 脚本2.2. 查询 username 列为空字符串 的所有数据2.3. 查询 username 列为空值 null 的所有数据2.3.1. 错误 SQL2.3.2. 正确 SQL 2.4. 查询 username 列不为空值 null 的所有数据2.4.1. 错…

空字符'\0'与字符串

from&#xff1a; https://blog.csdn.net/bairenxinmo/article/details/17662983 空字符\0 空字符即NUL字节&#xff0c;是一个ASCII值为0的控制字符&#xff0c;在程序代码中通常以转义序列\0表示&#xff0c;在C语言中&#xff0c;空字符非常重要&#xff0c;主要体现在字符…

空字符和空格字符有什么区别?

char ch1 \0 ,ch2 ;System.out.println(""(int)ch1);System.out.println(""(int)ch2); 运行结果 由此可见&#xff0c;空字符(\0)的ascii值是0&#xff0c;实际应用上是字符串结尾自动补上的一个字符 有的时候用来判断是否到了字符串结尾 而空格字符…

认真理清 一一空字符('\0')、空指针(NULL)、\0、0

在C/C语言中我们经常看到’\0’、NULL。从概念上看两者完全不同&#xff0c;但是本质上他们都可以用数值0来表示。空指针是指针类型&#xff0c;而空字符是整形类型&#xff0c;两者有时很容易混淆。 NULL 空指针有一个值&#xff0c;该值不会与任何数据的有效值地址对应。通…

空字符 空格字符(字符) 空字符串 NULL的区别

【1】 空字符 空格字符&#xff08;字符&#xff09;【2】空字符串 【3】 NULL的区别 1.1 字符 &#xff08;1&#xff09;首先必须明确字符型&#xff08;char&#xff09;是整数类型&#xff0c;其在内存单元是以整数形式存放。 &#xff08;2&#xff09;其次&am…

CSS属性值的计算过程

属性值的计算过程 一个元素一个元素依次渲染&#xff0c;顺序按照页面文档的树形目录结构进行 渲染每个元素的前提条件&#xff1a;该元素的所有CSS属性必须有值 一个元素&#xff0c;从所有属性都没有值&#xff0c;到所有的属性都有值&#xff0c;这个计算过程&#xff0…

Java 反射设置/获取对象属性值

✨大家好&#xff0c;我是【zhuzicc】~ &#xff0c;一位主攻【Java】的 攻城狮&#xff01;✨ 欢迎对【Java】感兴趣的大佬&#xff0c;关注我 &#x1f61c; ———————————————— ❤️ ❤️ ❤️ 如果觉得本文还不错&#xff0c;点赞 评论 关注 收藏。有补充…

字段与属性

字段的使用: 1.关于字段 a.字段又称为&#xff1a;“成员变量”&#xff0c;一般在类的内部做数据交互使用。 b.字段命名规范&#xff1a;camel命名法&#xff08;Camel 命名法是指第一个单词小写&#xff0c;从第二个单词开始每个单词的首字母大写&#xff09;。 2.通俗的理解…