- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解C语言中printf输出的相关函数由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
C语言printf()函数:格式化输出函数 printf()函数是最常用的格式化输出函数,其原型为:
1
|
int
printf
(
char
* format, ... );
|
printf()会根据参数 format 字符串来转换并格式化数据,然后将结果输出到标准输出设备(显示器),直到出现字符串结束('\0')为止.
参数 format 字符串可包含下列三种字符类型:
格式转换为一个百分比符号(%)及其后的格式字符所组成。一般而言,每个%符号在其后都必需有一个参数与之相呼应(只有当%%转换字符出现时会直接输出%字符),而欲输出的数据类型必须与其相对应的转换字符类型相同.
printf()格式转换的一般形式如下:
1
|
%(flags)(width)(. prec)type
|
以括号括起来的参数为选择性参数,而%与type 则是必要的,下面介绍 type 的几种形式.
1) 整数 。
2) 字符及字符串 。
prec 有几种情况:
width 为参数的最小长度,若此栏并非数值,而是*符号,则表示以下一个参数当做参数长度.
flags 有下列几种情况 。
【返回值】成功则返回写入的字符数目.
如果发生写入错误,将会设置文件错误标志(可通过 ferror() 检测),并返回一个负数.
如果在写入宽字符时一个多字节的字符发生编码错误,那么 errno 将被设置为 EILSEQ,并返回一个负数.
printf( format, ... ) 等价于 fprintf(stdout, format, ...),更多信息请参考 fprintf() 函数.
【实例】分别输出整数、浮点数和字符串.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include<stdio.h>
int
main(
void
)
{
int
a=1;
float
b=5.0;
char
str[100]=
""
;
scanf
(
"%c %c %c"
,&a,&b,str);
/*分别演示 整数*/
printf
(
"int is:%d\n"
,a);
/*分别演示 浮点数*/
printf
(
"float is:%f\n"
,b);
/*分别演示 字符串*/
printf
(
"char is:%s\n"
,str);
return
0;
}
|
输出结果: 【运行结果】 。
1
2
3
4
|
1 4.4 fs
int is:1
float is:4.400000
char is:fs
|
例子首先是等待用户输入整数浮点数和一个字符串,然后调用函数printf()按照对应的格式输出.
又如,输出更多格式的数据.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <stdio.h>
int
main()
{
printf
(
"Characters: %c %c \n"
,
'a'
, 65);
printf
(
"Decimals: %d %ld\n"
, 1977, 650000L);
printf
(
"Preceding with blanks: %10d \n"
, 1977);
printf
(
"Preceding with zeros: %010d \n"
, 1977);
printf
(
"Some different radices: %d %x %o %#x %#o \n"
, 100, 100, 100, 100, 100);
printf
(
"floats: %4.2f %+.0e %E \n"
, 3.1416, 3.1416, 3.1416);
printf
(
"Width trick: %*d \n"
, 5, 10);
printf
(
"%s \n"
,
"A string"
);
return
0;
}
|
输出结果:
1
2
3
4
5
6
7
8
|
Characters: a A
Decimals: 1977 650000
Preceding with blanks: 1977
Preceding with zeros: 0000001977
Some different radices: 100 64 144 0x64 0144
floats: 3.14 +3e+000 3.141600E+000
Width trick: 10
A string
|
C语言fprintf()函数:输出函数(格式化输出数据至文件) 头文件:
1
|
#include <stdio.h>
|
定义函数:
1
|
int
fprintf
(
FILE
* stream,
const
char
* format, ...);
|
函数说明:fprintf()会根据参数format 字符串来转换并格式化数据, 然后将结果输出到参数stream 指定的文件中, 直到出现字符串结束('\0')为止.
返回值:关于参数format 字符串的格式请参考printf(). 成功则返回实际输出的字符数, 失败则返回-1, 错误原因存于errno 中. 。
范例 。
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
main()
{
int
i = 150;
int
j = -100;
double
k = 3.14159;
fprintf
(stdout,
"%d %f %x \n"
, j, k, i);
fprintf
(stdout,
"%2d %*d\n"
, i, 2, i);
}
|
执行:
1
2
|
-100 3.141590 96
150 150
|
C语言sprintf()函数:将格式化的数据写入字符串 头文件:
1
|
#include <stdio.h>
|
sprintf()函数用于将格式化的数据写入字符串,其原型为:
1
|
int
sprintf
(
char
*str,
char
* format [, argument, ...]);
|
【参数】str为要写入的字符串;format为格式化字符串,与printf()函数相同;argument为变量.
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数--格式化字符串--上。 printf()和sprintf()都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串.
sprintf()最常见的应用之一莫过于把整数打印到字符串中,如:
sprintf的作用是将一个格式化的字符串输出到一个目的字符串中,而printf是将一个格式化的字符串输出到屏幕。sprintf的第一个参数应该是目的字符串,如果不指定这个参数,执行过程中出现 "该程序产生非法操作,即将被关闭...."的提示.
sprintf()会根据参数format 字符串来转换并格式化数据,然后将结果复制到参数str 所指的字符串数组,直到出现字符串结束('\0')为止。关于参数format 字符串的格式请参考printf().
【返回值】成功则返回参数str 字符串长度,失败则返回-1,错误原因存于errno 中.
注意:C语言对数组进行操作时并不检测数组的长度,如果str的长度不够,sprintf()很容易造成缓冲区溢出,带来意想不到的后果,黑客经常利用这个弱点攻击看上去安全的系统。请看下面的代码:
1
2
3
4
5
6
7
|
#include <stdio.h>
main()
{
char
buf[10];
sprintf
(buf,
"The length of the string is more than 10"
);
printf
(
"%s"
, buf);
}
|
编译并运行,屏幕上输出”The length of the string is more than 10“,同时系统提示程序已经停止。原因就是要写入的字符串的长度超过了buf的长度,造成缓冲区溢出.
使用snprintf()来代替sprintf()将能够很好的解决这个问题.
【实例】打印字母a的ASCII值.
1
2
3
4
5
6
7
8
|
#include <stdio.h>
main()
{
char
a =
'a'
;
char
buf[80];
sprintf
(buf,
"The ASCII code of a is %d."
, a);
printf
(
"%s"
, buf);
}
|
运行结果:
1
|
The ASCII code of a is 97.
|
又如,产生10个100以内的随机数并输出.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int
main(
void
)
{
char
str[100];
int
offset =0;
int
i=0;
srand
(
time
(0));
// *随机种子
for
(i = 0;i<10;i++)
{
offset+=
sprintf
(str+offset,
"%d,"
,
rand
()%100);
// 格式化的数据写入字符串
}
str[offset-1]=
'\n'
;
printf
(str);
return
0;
}
|
运行结果:
1
|
74,43,95,95,44,90,70,23,66,84
|
例子使用了一个新函数srand(),它能产生随机数。例子中最复杂的部分是for循环中每次调用函数sprintf()往字符数组写数据的时候,str+foffset为每次写入数据的开始地址,最终的结果是所有产生的随机数据都被以整数的形式存入数组中.
最后此篇关于详解C语言中printf输出的相关函数的文章就讲到这里了,如果你想了解更多关于详解C语言中printf输出的相关函数的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
至少在某些 ML 系列语言中,您可以定义可以执行模式匹配的记录,例如http://learnyouahaskell.com/making-our-own-types-and-typeclasses -
这可能是其他人已经看到的一个问题,但我正在尝试寻找一种专为(或支持)并发编程而设计的语言,该语言可以在 .net 平台上运行。 我一直在 erlang 中进行辅助开发,以了解该语言,并且喜欢建立一个稳
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我正在寻找一种进程间通信工具,可以在相同或不同系统上运行的语言和/或环境之间使用。例如,它应该允许在 Java、C# 和/或 C++ 组件之间发送信号,并且还应该支持某种排队机制。唯一明显与环境和语言
我有一些以不同语言返回的文本。现在,客户端返回的文本格式为(en-us,又名美国英语): Stuff here to keep. -- Delete Here -- all of this below
问题:我希望在 R 中找到类似 findInterval 的函数,它为输入提供一个标量和一个表示区间起点的向量,并返回标量落入的区间的索引。例如在 R 中: findInterval(x = 2.6,
我是安卓新手。我正在尝试进行简单的登录 Activity ,但当我单击“登录”按钮时出现运行时错误。我认为我没有正确获取数据。我已经检查过,SQLite 中有一个与该 PK 相对应的数据。 日志猫。
大家好,感谢您帮助我。 我用 C# 制作了这个计算器,但遇到了一个问题。 当我添加像 5+5+5 这样的东西时,它给了我正确的结果,但是当我想减去两个以上的数字并且还想除或乘以两个以上的数字时,我没有
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 4 年前。 Improve th
这就是我所拥有的 #include #include void print(int a[], int size); void sort (int a[], int size); v
你好,我正在寻找我哪里做错了? #include #include int main(int argc, char *argv[]) { int account_on_the_ban
嘿,当我开始向数组输入数据时,我的代码崩溃了。该程序应该将数字读入数组,然后将新数字插入数组中,最后按升序排列所有内容。我不确定它出了什么问题。有人有建议吗? 这是我的代码 #include #in
我已经盯着这个问题好几个星期了,但我一无所获!它不起作用,我知道那么多,但我不知道为什么或出了什么问题。我确实知道开发人员针对我突出显示的行吐出了“错误:预期表达式”,但这实际上只是冰山一角。如果有人
我正在编写一个点对点聊天程序。在此程序中,客户端和服务器功能写入一个唯一的文件中。首先我想问一下我程序中的机制是否正确? I fork() two processes, one for client
基本上我需要找到一种方法来发现段落是否以句点 (.) 结束。 此时我已经可以计算给定文本的段落数,但我没有想出任何东西来检查它是否在句点内结束。 任何帮助都会帮助我,谢谢 char ch; FI
我的函数 save_words 接收 Armazena 和大小。 Armazena 是一个包含段落的动态数组,size 是数组的大小。在这个函数中,我想将单词放入其他称为单词的动态数组中。当我运行它时
我有一个结构 struct Human { char *name; struct location *location; int
我正在尝试缩进以下代码的字符串输出,但由于某种原因,我的变量不断从文件中提取,并且具有不同长度的噪声或空间(我不确定)。 这是我的代码: #include #include int main (v
我想让用户选择一个选项。所以我声明了一个名为 Choice 的变量,我希望它输入一个只能是 'M' 的 char 、'C'、'O' 或 'P'。 这是我的代码: char Choice; printf
我正在寻找一种解决方案,将定义和变量的值连接到数组中。我已经尝试过像这样使用 memcpy 但它不起作用: #define ADDRESS {0x00, 0x00, 0x00, 0x00, 0x0
我是一名优秀的程序员,十分优秀!