当前位置:首页 » 编程语言 » c语言指令及用法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言指令及用法

发布时间: 2023-08-31 01:29:52

c语言中goto语句的用法举例来说。

goto语句可以使程序在没有任何条件的情况下跳转到指定的位置,所以goto语句又被称为是无条件跳转语句。

它的语法如下

goto label;

//其它代码

label:

其中,label为我们自己定义的一个标签,定义的规则与变量的命名相同,它的位置是不固定的,它可以写在goto语句的后面,也可以写在它的前面,然而goto语句只能在一个函数内部跳转,它并不允许跳转出一个函数外部。

int day = 1;

loop:

if (day <= 31)

{

printf("%d ", day);

day++;

goto loop;

}

上面程序就是利用了goto和if语句来实现了循环功能,它与while实现的循环功能一样,其中loop为我们定义的一个label(标签)。

(1)c语言指令及用法扩展阅读:

使用goto语句的建议

1) 使用goto语句只能goto到同一函数内,而不能从一个函数里goto到另外一个函数里。

2) 使用goto语句在同一函数内进行goto时,goto的起点应是函数内一段小功能的结束处,goto的目的label处应是函数内另外一段小功能的开始处。

3) 不能从一段复杂的执行状态中的位置goto到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。

4)应该避免向两个方向跳转。这样最容易导致"面条代码"。

② C语言的按照标识符、关键字、常用编译指令有哪些

我们可以在C源程序中插入传给编译程序的各中指令,这些指令被称为预处理器指令,它们扩充了程序设计的环境。现把常用的预处理命令总结如下:
1. 预处理程序
按照ANSI标准的定义,预处理程序应该处理以下指令:
#if #ifdef #ifndef #else #elif
#endif
#define
#undef
#line
#error
#pragma
#include
显然,上述所有的12个预处理指令都以符号#开始,,每条预处理指令必须独占一行。
2. #define
#define指令定义一个标识符和一个串(也就是字符集),在源程序中发现该标识符时,都用该串替换之。这种标识符称为宏名字,相应的替换称为宏代换。一般形式如下:
#define macro-name char-sequence
这种语句不用分号结尾。宏名字和串之间可以有多个空白符,但串开始后只能以新行终止。
例如:我们使用LEFT代表1,用RIGHT代表0,我们使用两个#define指令:
#define LEFT 1
#define RIGHT 0
每当在源程序中遇到LEFT或RIGHT时,编译程序都用1或0替换。
定义一个宏名字之后,可以在其他宏定义中使用,例如:
#define ONE 1
#define TWO ONE+ONE
#define THREE ONE+TWO
宏代换就是用相关的串替代标识符。因此,如果希望定义一条标准错误信息时,可以如下定义:
#define ERROR_MS “Standard error on input \n”
如果一个串长于一行,可在行尾用反斜线”\”续行,如下:
#define LONG_STRING “This is a very very long \
String that is used as an example”
3. #error
#error指令强制编译程序停止编译,它主要用于程序调试。#error指令的一般形式是:
#error error-message
注意,宏串error-message不用双引号包围。遇到#error指令时,错误信息被显示,可能同时还显示编译程序作者预先定义的其他内容。
4. #include
程序中的#include指令要求编译程序读入另一个源文件。被读入文件的名字必须用双引号(“”)或一对尖括号(<>)包围,例如:
#include “stdio.h”
#include <stdio.h>
都使C编译程序读入并编译头文件以用于I/O系统库函数。
包含文件中可以包含其他#include指令,称为嵌套包含。允许的最大嵌套深度随编译器而变。
文件名被双括号或尖括号包围决定了对指定文件的搜索方式。文件名被尖括号包围时,搜索按编译程序作者的定义进行,一般用于搜索某些专门放置包含文件的特殊目录。当文件名被双括号包围时,搜索按编译程序实时的规定进行,一般搜索当前目录。如未发现,再按尖括号包围时的办法重新搜索一次。
通常,绝大多数程序员使用尖括号包围标准的头文件,双引号用于包围与当前程序相关的文件名。
5. 条件编译指令
若干编译指令允许程序员有选择的编译程序源代码的不同部分,这种过程称为条件编译。
5.1#if、#else、#elif #endif
条件编译指令中最常用的或许是#if,#else,#elif和#endif。这些指令允许程序员根据常数表达式的结果有条件的包围部分代码。
#if的一般形式是:
#if constant-expression
Statement sequence
#endif
如#if后的常数表达式为真,则#if和#endif中间的代码被编译,否则忽略该代码段。#endif标记#if块的结束。
#else指令的作用与C语言的else相似,#if指令失败时它可以作为备选指令。例如:
#include <stdio.h>
#define MAX 100
Int main(void)
{
#if MAX>99
printf(“Compiled for array greater than 99.\n”);
#else
printf(“Complied for small array.\n”);
#endif
return 0;
}

③ C语言中很多的预处理指令include、define等等它们各自的意义分别是什么

include的作用: #include叫做“文件包含” / include 语句包含并运行指定文件。 功能:它的功能是用来指定文件的全部内容替换程序中的命令行,从而使指定的文件与当前源文件连成一个源文件 书写格式: #include <文件名> //表示编译系统根据系统头文件存放的目录路径去搜索系统头文件,而不是在源文件目录去查找 #include "文件名" //表示编译系统首先在当前的源文件目录中查找,若未找到才根据系统的头文件存放的目录路径去搜索系统头文件 //系统定义的头文件通常使用尖括号;用户自定义的头文件通常使用双引号。 //一般来说,如果为调用库函数而用#include命令来包含相关的头文件,则用尖括号,以节约查找时间。 //如果要包含的是用户自己编写的文件(这种文件一般都在用户当前的目录中),一般用双撇号。 //若文件不在当前目录中,在双撇号内应该给出文件路径(如#include"C:\wang\file2.h") ----------------- 1.#define 的作用 在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。 在C或C++语言中,“宏”分为有参数和无参数两种。 2. 无参宏定义 无参宏的宏名后不带参数。 其定义的一般形式为: #define 标识符 字符串 其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。 例如: #define M (a+b) 它的作用是指定标识符M来代替表达式(a+b)。在编写源程序时,所有的(a+b)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(a+b)表达式去置换所有的宏名M,然后再进行编译。 程序1: #define M (a+b) main(){ int s,y; printf("input a number: "); scanf("%d",&y); s=M*M; printf("s=%d\n",s); } 上例程序中首先进行宏定义,定义M来替代表达式(a+b),在 s= M * M 中作了宏调用。在预处理时经宏展开后该语句变为: S=(a+b)*(a+b) 但要注意的是,在宏定义中表达式(a+b)两边的括号不能少。否则会发生错误。 如当作以下定义后:#difine M (a)+(b) 在宏展开时将得到下述语句:S= (a)+(b)*(a)+(b) 对于宏定义还要说明以下几点: 1. 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。 2. 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。 3. 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。 3. 带参宏定义 c语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。 带参宏定义的一般形式为: #define 宏名(形参表) 字符串 在字符串中含有各个形参。 带参宏调用的一般形式为: 宏名(形参表) 例如: #define M(y) ((y)*(y)+3*(y)) /*宏定义*/ .... k=M(5); /*宏调用*/ .... 在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为: k=5*5+3*5 程序2: #define MAX(a,b) (a>b)?a:b main(){ int x,y,max; printf("input two numbers: "); scanf("%d%d",&x,&y); max=MAX(x,y); printf("max=%d\n",max); } 上例程序的第一行进行带参宏定义,用宏名MAX表示条件表达式(a>b)?a:b,形参a,b均出现在条件表达式中。程序第七行max=MAX(x,y)为宏调用,实参x,y,将代换形参a,b。宏展开后该语句为: max=(x>y)?x:y; 用于计算x,y中的大数。

④ 求大神整理c语言指令符号及用法大全。

编译指令

编译指令

说明

#include

包含另一个文件

#define

定义一个宏(macro)或是常量

#undef

取消一个宏常量的定义

#asm和#endasm

在程序中加入汇编语言的程序

#ifdef、#ifndef、#else、#endif

用于条件式的编译

注解://—单行注解;
基本数据类型 (int,float,double,char,void)

数据类型

类型说明

长度(位)

数据长度

bit



1

0,1

char

字符

8

—128~127

unsigned char

无符号字符

8

0~255

signed char

有符号字符

8

—128~127

int

整型

16

—32768~32767

short int

短整型

16

—32768~32767

unsigned int

无符号整型

16

0~65535

signed int

有符号整型

16

—32768~32767

long int

长整型

32

—2147483648~2147483647

unsigned long int

无符号长整型

32

0~4294967295

signed long int

有符号长整形

32

—2147483648~2147483647

float

浮点数(实数)

32

0.175e-38~0.402e38

double

双精度浮点

32

0.175e-38~0.402e38

void



0

没任何数据

用户自定义数据类型格式
typedef struct{
数据类型 变量序列1;
数据类型 变量序列1;
...
}自定义数据类型的名称;
保留字
_at_,alien,bdata,break,bit,case,char,code,compact,const,continue,data,
default,do,double,far,else,enum,extern,float,for,goto,if,funcused,idata,int,
inline,interrupt,large,long,pdata,_priority_,reentrant,return,sbit,sfr,sfr16,
short,sigend,sizeof,small,static,struct,switchc_task_,typedef,using,union,
unsigned,void,volatile,while,xdata

常量表示法

常数

规则

范例

十进制

一般十进制格式

1234567890

二进制

开头加上0b

0b00001110

八进制

开头加上O

O0123

十六进制

开头加上0x

0xFF45

无符号整数常量

结尾加上U

30000U

长整数常量

结尾加上L

299L

无符号长整数常量

结尾加上UL

327800UL

浮点数的常量

结尾加上F

4.234F

字符常量

以单引号括起来

‘a’

字符串常量

以双引号括起来

“hello”

-----------------------------------------------------运算符-----------------------------------------------------
算术运算

运算符

说明

范例

执行结果

+



c=a+b;

c 等于10





d=a—b;

d 等于6

*



e=a*b;

e 等于16

/



f=a/b;

f 等于4

%

取余数

g=a%b;

g 等于0

++

加1

c++;相当于c=c+1;

c 等于11

——

减1

d——;相当于d=d—1;

d 等于5

=

等于

a=8;

设置a等于8

+=

先相加在等于

e+=5;相当于e=e+5;

e 等于21

—=

先相减在等于

f—=5;相当于f=f—5;

f 等于—1

*=

先相乘在等于

b*=5;相当于b=b*5;

b 等于0

/=

先相除在等于

a/=5;相当于a=a/5;

a 等于1

%=

先取余数在等于

a%=5;相当于a=a%5;

a 等于3

※假设a等于8,b等于2
比较运算

运算符

说明

范例

执行结果

==

等于

a==5

F

!=

不等于

a!=5

T

<<o:p>

小于

a<5

F

>

大于

a>5

T

<=

小于等于

a<=5

F

>=

大于等于

a>=5

T

※比较运算结果是个布尔值既TRUE(真值)或FALSE(假值)。假设a等于8

逻辑运算

运算符

说明

范例

执行结果

&&

AND

(a>5)&&(a<10)

T

||

OR

(a<5)||(a>10)

F

!

NOT

!(a>10)

T

※逻辑运算结果是个布尔值既TRUE(真值)或FALSE(假值)。假设a等于8
位逻辑运算

运算符

说明

范例

执行结果

&

AND

a&0x01

a等于1

|

OR

a|0x80

a等于0x85

~

NOT

~a

a等于0xFA

^

XOR

a^0xFF

a等于0xFA

<<

左移

a<<1

a等于0x0A

>>

右移

a>>1

a等于0x0A

※假设a等于5
----------------------------------------------------控制命令---------------------------------------------------
if语句
if(条件) 语句1;
else 语句2;
例:if(d==4) d=0; //如果d等于4就设置d等于0
else d++; //否则就将d加1
if(ticks==0) { //如果ticks等于0
ticks=1000; //ticks 设置成1000
counter[0]++; //counter[0]加1
}

嵌套if语句
例:if(counter[0]==10) {
counter[1]++;
counter[0]=0;
if(counter[1]==10) {
counter[2]++;
counter[1]=0;
}
}

switch语句
switch (变量) {
case 常量1:语句1; break;
case 常量2:语句2; break;
case 常量3:语句3; break;
......
default ; 语句n;
}
for循环
for (初值,条件,变化值) 语句;
例:for(i=0;i<10;i++) x=x+i;
for(i=1;i<10,i++)
for(j=1;j<10,j++)
printf(“%d %d”,i,j);
无穷循环:
for( ; ; );

while循环
while (条件) 语句;
例:while (ch!=!’A’) ch=getche();
无穷循环:
while(1);

do/while循环
do {
语句;
...
} while(条件);
例:do {
ch=getche();
} while (ch!=”A”);

goto语句
loop1:
x++;
if(x<100) goto loop1;
----------------------------------------------------指针和函数------------------------------------------------
指针的定义
数据类型 *指针变量的名字;
例: char *p;
int *x;

指针与数组
例: char filename[80];
char *p;
p=filename; //指针p存放filename的开始地址

int x[5]={1,2,3,4,5};
int *p,sum,i;
p=x; //指针p存放数组x的开始地址
for(i=0;i<5;i++)
sum=sum+p[i]; //p[i]相当于x[i]

指针的运算
1.针变量前面加上*号就是取得指针所指向位置的内容。
例:int x[5]={1,2,3,4,5};
int *p;
p=x; //指针p存放数组x的开始地址
*p=10; //相当于设置x[0]等于10
2.变量前面加上&符号,可以取得一个变量的位置。
例:int x,y;
int *p;
p=&x; //指针p存放x的地址,相当于p是指向x 的指针
*p=1; //相当于设置x等于1
3.&符号也可以加在数组的前面
例:int x[5];
int *p;
p=&x[2]; //指针p存放x[2]的地址,相当于p是指向x[2]的指针
*p=50; //相当于设置x[2]等于50
函数
函数类型 函数名称(参数序列);
参数说明
{
函数的主体
}
例:void delay (void) { //不返回任何数据的函数
unsigned char i,j; //没有任何参数的函数
for(i=0,i<255,i++)
for(j=0,j<255,j++);
}
main()
{
...
delay(); //调用函数
}
例:unsigned char sum(unsigned chat a,unsigned chat b)
{
unsigned chat x;
check_GLCD_busyflag(); //函数中可以调用另一个函数
x=a+b;
return x; //return会返回x的数据
}
中断服务函数
void 中断服务程序的名称(void) interrupt 中断号码using 寄存器组号码
{
中断服务子程序主体
}

中断号码
#define IE0_VECTOR 0 //0x03
#define TF0_VECTOR 1 //0x0B
#define IE1_VECTOR 2 //0x13
#define TF1_VECTOR 3 //0x1B
#define SIO_VECTOR 4 //0x23
对于S51有定时器2
#define TF2_VECTOR 5 //0x2B
例:static void xint0_isr(void) interrupt IE0_VECTOR(或0) using 1
{
unsigned char i,j=0xFF;
for(i=0,i<16,i++)
{
j++;
P1=j; //将数值输出到P1口
delay_4isr();
}
}
-----------------------------------------------------汇编语言--------------------------------------------------
在C中加入汇编语言
例:void delay100us()
{
#pragma asm
mov r7,#1
more: mov r3,#48
djnz r3,$
djnz r7,more
#pragma endasm
}
----------------------------------------------------宏(macro)----------------------------------------------
宏的定义
%*define (macro名称) (macro的指令)
例:%*define (write_1) (
setb DI
serb SK
clr SK
)

#define 宏的名称 宏的指令
例:#define uchar unsigned char

C语言中的符号总结
运算符的种类C语言的运算符可分为以下几类;
1. 算术运算符
用于各类数值运算,包括加减乘除求余自增自减共七种运算
{ ( + ) ,( - ),(* ) ,( / ) ,( % ),( ++ ),(-- )}。
2. 关系运算符
用于比较运算,包括大于(>),小于(<</span>),等于(==),大于等于(>=),
小于等于(<=),不等于(!=)共六种。
3.逻辑运算符
用于逻辑运算,包括与(&&)或(||)非(!)三种.
4.位操作运算符
参与运算的量,按二进制位进行运算,包括:
位与(&),位或(|),位非(~),为异或(^),左移(<<),右移(>>)共六种。
5.赋值运算符
用于赋值运算,分为:
简单赋值(=)
复合算术赋值(+=,-=,*=,/=,%=)
复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
6.条件运算符
这是一个三目运算符,用于条件求值(?:)。
7.逗号运算符
用于把若干表达式组合成一个表达式(,)。
8.指针运算符
用于取内容(*)和取地址(&)两种运算。
9.求字节数运算符
用于计算数据类型所占用的字节数(sizeof)。
10.特殊运算符
有括号(),下标[],成员(→, .)

1.C的数据类型
基本类型,构造类型,指针类型,空类型
2.基本类型的分类及特点
类型说明符 字节 数值范围
字符型char 1 C字符集
基本整型int 2 -32768~32767
短整型short int 2 -32768~32767
长整型 long int 4 -214783648~214783647
无符号型 unsigned 2 0~65535
无符号长整型 unsigned long 4 0~4294967295
单精度实型 float 4 3/4E-38~3/4E+38
双精度实型 double 8 1/7E-308~1/7E+308
3.常量后缀
L或l 长整型
U或u 无符号数
F或f 浮点数
4.常量类型
整数,长整数,无符号数,浮点数,字符,字符串,符号常数,转义字符。
5.数据类型转换
a自动转换
在不同类型数据的混合运算中,由系统自动实现转换, 由少字节类型向多字节类型转换。 不同类型的量相互赋值时也由系统自动进行转换,把赋值号右边的类型转换为左边的类型。
b强制转换
由强制转换运算符完成转换。
6.运算符优先级和结合性
一般而言,单目运算符优先级较高,赋值运算符优先级低。 算术运算符优先级较高,关系和逻辑运算符优先级较低。 多数运算符具有左结合性,单目运算符、三目运算符、 赋值
7.表达式
表达式是由运算符连接常量、变量、函数所组成的式子。 每个表达式都有一个值和类型。 表达式求值按运算符的优先级和结合性所规定的顺序进行。

表示输出类型的格式字符 格式字符意义
d 以十进制形式输出带符号整数(正数不输出符号)
o 以八进制形式输出无符号整数(不输出前缀O)
x 以十六进制形式输出无符号整数(不输出前缀OX)
u 以十进制形式输出无符号整数
f 以小数形式输出单、双精度实数
e 以指数形式输出单、双精度实数
g 以%f%e中较短的输出宽度输出单、双精度实数
c 输出单个字符
s 输出字符串
标志字符为-、+、#、空格四种,其意义下表所示:
标志格式字符 标 志 意 义
- 结果左对齐,右边填空格
+ 输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号
# 对c,s,d,u类无影响;对o类, 在输出时加前
缀o 对x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点
格式字符串

格式字符串的一般形式为: %[*][输入数据宽度][长度]类型 其中有方括号[]的项为任选项。各项的意义如下:
1.类型
表示输入数据的类型,其格式符和意义下表所示。
格式 字符意义
d 输入十进制整数
o 输入八进制整数
x 输入十六进制整数
u 输入无符号十进制整数
f或e 输入实型数(用小数形式或指数形式)
c 输入单个字符
s 输入字符串
转义字符
转义字符是一种特殊的字符常量。转义字符以反斜线”\”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。例如,在前面各例题printf函数的格式串中用到的“\n”就是一个转义字符,其意义是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。
常用的转义字符及其含义
转义字符 转义字符的意义
\n 回车换行
\t 横向跳到下一制表位置
\v 竖向跳格
\b 退格
\r 回车
\f 走纸换页
\\ 反斜线符”\”
\’ 单引号符
\a 鸣铃
\ddd 1~3位八进制数所代表的字符
\xhh 1~2位十六进制数所代表的字符
广义地讲,C语言字符集中的任何一个字符均可用转义字符来表示。表2.2中的\ddd和\xhh正是为此而提出的。ddd和hh分别为八进制和十六进制的ASCII代码。如\101表示字?quot;A” ,\102表示字母”B”,\134表示反斜线,\XOA表示换行等。转义字符的使用
在C语言中,对变量的存储类型说明有以下四种:
auto 自动变量
register 寄存器变量
extern 外部变量
static 静态变量
自动变量和寄存器变量属于动态存储方式, 外部变量和静态变量属于静态存储方式。在介绍了变量的存储类型之后, 可以知道对一个变量的说明不仅应说明其数据类型,还应说明其存储类型。 因此变量说明的完整形式应为: 存储类型说明符 数据类型说明符 变量名,变量名…; 例如:
static int a,b; 说明a,b为静态类型变量
auto char c1,c2; 说明c1,c2为自动字符变量
static int a[5]={1,2,3,4,5}; 说明a为静整型数组
extern int x,y; 说明x,y为外部整型变量
与指针有关的各种说明和意义见下表。
int *p; p为指向整型量的指针变量
int *p[n]; p为指针数组,由n个指向整型量的指针元素组成。
int (*p)[n]; p为指向整型二维数组的指针变量,二维数组的列数为n
int *p() p为返回指针值的函数,该指针指向整型量
int (*p)() p为指向函数的指针,该函数返回整型量
int **p p为一个指向另一指针的指针变量,该指针指向一个整型量。

指针变量的赋值
p可以有以下两种方式:
(1)指针变量初始化的方法 int a;
int *p=&a;
(2)赋值语句的方法 int a;
int *p;
p=&a;

(1)取地址运算符&
(2)取内容运算符*

⑤ c语言 出现的#if 0 表示什么

c语言 出现的#if 0 是预编译指令,表示之后的代码不执行。

C语言中预编译指令#if、#else和#endif指令一般配合使用。#if 后面的参数为真(非0)则执行#if 后面的模块。#if 后面的参数为假,则不执行#if 后面的模块。

此指令多用在调试的时候,有段代码不想删除,怕后面用到所以用 #if 0 来暂时注释掉,如果想用的话就用#if 1 来开启;例如: #if true 执行 #endif #if false 跳过 #endif。

(5)c语言指令及用法扩展阅读:

常见的预编译指令有:

一、#include 指令

该指令指示编译器将xxx.xxx文件的全部内容插入此处。若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用" "括起文件则在当前目录中寻找文件。一般来说,该文件是后缀名为"h"或"hpp"的头文件。

二、#define指令有三种用法:

1、第一种是定义标识,标识有效范围为本翻译单元本指令之后,形如#define XXX,常与#if配合使用;

2、第二种是定义常数,如#define max 100,则max代表100;

3、第三种是定义"函数",如#define get_max(a, b) ((a)>(b)?(a):(b)) 则以后使用get_max(x,y)就可以得到x和y中较大的数(这种方法存在一些弊病,见注2)。

⑥ c语言中printf的用法

c语言中printf的用法的用法你知道吗?下面我就跟你们详细介绍下c语言中printf的用法的用法,希望对你们有用。

c语言中printf的用法的用法如下:

Printf和Scan函数的使用方法

一 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出

信息。在编写程序时经常会用到此函数。printf()函数的调用格式为:

printf("<格式化字符串>", <参量表>);

其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原

样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,

用来确定输出内容格式。

参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出

参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想

不到的错误。

格式化字符串的格式是:

%[标志][输出最小宽度][.精度][长度]格式字符

1. 标志:标志字符为-、+、#、空格四种,其意义下表所示:

标志 意义

- 结果左对齐,右边填空格

+ 输出符号(正号或负号)

空格 输出值为正时冠以空格,为负时冠以负号

# 对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;对e,g,f 类当结果有小数 时才给出小数点(??????)

例1:

#i nclude

main()

{

int a=100;

float b=123.255;

printf("a=%d ",a);

printf("a=d ",a);

printf("a=%-10d ",a);

printf("a=%+d ",a);

printf("a=% d ",a);

printf("a=%#o ",a);

printf("a=%#x ",a);

printf("b=%#f ",b);

}

运行结果

a=100

a= 100

a=100

a=+100

a= 100

a=0144

a=0x64

b=123.254997 (?????)

2.输出最小宽度:用十进制整数来表示输出的最少位数。(至少要输出这么多位!)

若实际位数多于定义的宽度:则按实际位数输出。

若实际位数少于定义的宽度:则右对齐,左边留空。

有负号,左对齐,右边留空

表示宽度的数字以0开始,则右对齐,左边留空。

例2 #i nclude

main()

{

int a=3456;

printf("a== ",a); //若实际位数多于定义的宽度:则按实际位数输出

printf("a=d ",a); //若实际位数少于定义的宽度:则右对齐,左边留空

printf("a=%-10d ",a); //若实际位数少于定义的宽度:有负号,左对齐,右边留空

printf("a=0d ",a); //若实际位数少于定义的宽度:表示宽度的数字以0开始,则右对齐,左边留空

printf("a=%-010d ",a); //左对齐,0无意义。

}

运行结果:

a=3456

a= 3456

a=3456

a=0000003456

a=3456

3.精度:精度格式符以“.”开头,后跟十进制整数。意义是:

如果输出数字,则表示小数的位数;若实际位数大于所定义的精度数,则四舍五入。若不足则补0;

如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。

例3:

#i nclude

main()

{

printf("%.3f ",12.3456);

printf("%.9f ",12.3456);

printf("%.3s ","abcdefg");

printf("%.9s ","abcdefg");

}

运行结果:

12.346 //四舍五入到小数点后三位

12.345600000 //不足补0

abc

abcdefg

4.长度:长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出?????

5.Turbo C2.0提供的格式字符如下:

━━━━━━━━━━━━━━━━━━━━━━━━━━

符号 作用

──────────────────────────

%c 单个字符

%d 十进制有符号整数

%e 以“科学记数法”的形式输出十进制的浮点数 如2.451e+02

%f 输出十进制浮点数,不带域宽时,保留6位小数

%g 选用e或f格式中较短的一个输出十进制浮点数,不输出无效零

%0 无输出无符号八进制整数

%p 指针的值

%s 输出字符串

%u 输出无符号十进制整数

%x, %X 输出无符号十六进制整数 (不输出前缀Ox)

━━━━━━━━━━━━━━━━━━━━━━━━━━

2. 一些特殊规定字符

━━━━━━━━━━━━━━━━━━━━━━━━━━

字符 作用

──────────────────────────

换行

f 清屏并换页

回车

Tab符

xhh 表示一个ASCII码用16进表示,

其中hh是1到2个16进制数

━━━━━━━━━━━━━━━━━━━━━━━━━━

使用这些转义字符时不需要加上%,可单独使用!

由本节所学的printf()函数, 并结合上一节学习的数据类型, 编制下面的程

序, 以加深对Turbo C2.0数据类型的了解。

例1

#i nclude

#i nclude

int main()

{

char c, s[20], *p;

int a=1234, *i;

float f=3.141592653589;

double x=0.12345678987654321;

p="How do you do";

strcpy(s, "Hello, Comrade");

*i=12;

c='x41';

printf("a=%d ", a);

printf("a=m ", a);

printf("a=d ", a);

printf("a=- ", a);

printf("*i=M ", *i);

printf("*i=%-4d ", *i);

printf("i=%p ", i);

printf("f=%f ", f);

printf("f=6.4f ", f);

printf("x=%lf ", x);

printf("x=.16lf ", x);

printf("c=%c ", c);

printf("c=%x ", c);

printf("s[]=%s ", s);

printf("s[]=%6.9s ", s);

printf("s=%p ", s);

printf("*p=%s ", p);

printf("p=%p ", p);

getch();

retunr 0;

}

其他需要注意的一些问题:

1.如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度,

小数点前的数字代表最小宽度。

例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。

2.使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Turbo C是按从右到左进行的。请看下面两个例子:

例1

main(){

int i=8;

printf("%d %d %d %d %d %d ",++i,--i,i++,i--,-i++,-i--);

}

运行结果

8

7

7

8

-7

-8

例2

main(){

int i=8;

printf("%d ",++i);

printf("%d ",--i);

printf("%d ",i++);

printf("%d ",i--);

printf("%d ",-i++);

printf("%d ",-i--);

}

运行结果:

9

8

8

9

-8

-9

这两个程序的区别是用一个printf语句和多个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。在第一例中,先对最后一项“-i--”求值,结果为-8,然后i自减1后为7。 再对“-i++”项求值得-7,然后i自增1后为8。再对“i--”项求值得8,然后i再自减1后为7。再求“i++”项得7,然后i再自增1后为8。 再求“--i”项,i先自减1后输出,输出值为7。 最后才求输出表列中的第一项“++i”,此时i自增1后输出8。

但是必须注意,求值顺序虽是自右至左,但是输出顺序还是从左至右,因此得到的结果是上述输出结果。

补充:最近在调试程序时发现一段代码如下:

printf(sFormat,"%%0?",THE_NUMBER_LEN);

输出数组后发现sFormat = d;其中宏THE_NUMBER_LEN定义的为4,发现如果需要通过在printf转化的数组中出现%,那么就使用%%来代替,且后面的所有字符都会直接放入sFormat数组中一直遇到新的%。只有碰到“%+特定字符”,才会把右边对应的变量放入进来。

例如: printf(sFormat,"ABC%%d%d%%s?bc",THE_NUMBER_LEN,6);输出为ABC?%s6abc;

还有就是发现如果是修改成%0?,输出的字符串就变成 ?,这样我猜想就是在printf函数时,碰到第一个%0后知道再遇见下一个%前,如果中间没有特定字符d,s,e,f等,通通变成空格,而我在%中间增加两个的非特殊字符后,发现?前面的空格急剧增加,原因就不清楚。故两%之间不能增加其他非特殊字符。

二 Scan函数

scanf()函数是格式化输入函数, 它从标准输入设备(键盘) 读取输入的信息。

其调用格式为:

scanf("<格式化字符串>", <地址表>);

格式化字符串包括以下三类不同的字符;

1. 格式化说明符: 格式化说明符与printf()函数中的格式说明符基本相同。

2. 空白字符: 空白字符会使scanf()函数在读操作中略去输入中的一个或多

个空白字符。

3. 非空白字符: 一个非空白字符会使scanf()函数在读入时剔除掉与这个非

空白字符相同的字符。

注意:(1)地址表是需要读入的所有变量的地址, 而不是变量本身:

----如果是一般的变量,通常要在变量名前加上"&";但输出时是用变量名

----如果是数组,用数组名就代表了该数组的首地址;输出时也是用数组名

----如果是指针,直接用指针名本身,不要加上“*”;输出时也用该指针即可。

例1:

各个变量的地址之间同","分开。

main()

{

int i;

char *p, str[20];

scanf("%d", &i);

scanf("%s", p);

scanf("%s", str);

printf("i=%d ",i);

printf("%s ", p);

printf("%s ", str);

}

(2)scanf函数中是否包含空白/非空白字符导致输入格式的不同

如:scanf("%d,%d",&i,&j); scanf中有,所以输入的格式应该是5,6==>i=5,j=6

scanf("%d%d",&i,&j); 可以用空格或回车来分隔两个输入 如 5 6==>i=5,j=6

scanf("%d %d",&i,&j); 同上

(3) 实际使用scanf()函数时存在一个问题, 下面举例进行说明:

当使用多个scanf()函数连续给多个字符变量输入时, 例如:

main()

{

char c1, c2;

scanf("%c", &c1);

scanf("%c", &c2);

printf("c1 is %c, c2 is %c", c21, c2);

}

运行该程序, 输入一个字符A后回车 (要完成输入必须回车), 在执行scanf

("%c", &c1)时, 给变量c1赋值"A", 但回车符仍然留在缓冲区内, 执行输入语句

scanf("%c", &c2)时, 变量c2输出的是一空行, 如果输入AB后回车, 那么输出结

果为: c1 is A, c2 is B。

要解决以上问题, 可以在输入函数前加入清除函数fflush()( 这个函数的使

用方法将在本节最后讲述)。修改以上程序变成:

#i nclude

main()

{

char c1, c2;

scanf("%c", &c1);

fflush(stdin);

scanf("%c", &c2);

printf("c1 is %c, c2 is %c", c1, c2);

}

在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。

例如:scanf("%c%c%c",&a,&b,&c);

输入为:d e f

则把'd'赋予a, ' ' 赋予b,'e'赋予c。

只有当输入为: def

时,才能把'd'赋于a,'e'赋予b,'f'赋予c。

如果在格式控制中加入空格作为间隔,

如:scanf ("%c %c %c",&a,&b,&c);

则输入时各数据之间可加空格。

例4

main(){

char a,b;

printf("input character a,b ");

scanf("%c%c",&a,&b);

printf("%c%c ",a,b);

}

由于scanf函数"%c%c"中没有空格,输入M N,结果输出只有M。而输入改为MN时则可输出MN两字符。

(4)格式字符串的一般形式为:

%

[输入数据宽度][长度]类型

其中有方括号[]的项为任选项。各项的意义如下:

1)类型:表示输入数据的类型,其格式符和意义如下表所示。

格式 字符意义

d 输入十进制整数

o 输入八进制整数

x 输入十六进制整数

u 输入无符号十进制整数

f或e 输入实型数(用小数形式或指数形式)

c 输入单个字符

s 输入字符串

2)“*”符:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。

如:scanf("%d %*d %d",&a,&b);

当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。

3)宽度:用十进制整数指定输入的宽度(即字符数)。

例如:

scanf("]",&a);

输入:12345678

只把12345赋予变量a,其余部分被截去。

又如:scanf("MM",&a,&b);

输入:12345678

将把1234赋予a,而把5678赋予b。

例:

main()

{

int a,b;

scanf("MM",&a,&b);

printf("a=%d,b=%d",a,b);

}

输入 12345 67890

运行结果 a=1234,b=5

4) 长度:长度格式符为l和h,l表示输入长整型数据(如%ld) 和双精度浮点数(如%lf)。h表示输入短整型数据。

使用scanf函数还必须注意以下几点:

1)scanf函数中没有精度控制,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。

2)在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。

⑦ C语言中的Scanf的用法

scanf 函数最主要的用法是:

scanf("输入控制符", 输入参数);

函数原型:intscanf(constchar*restrictformat,...);

函数 scanf() 是从标准输入流stdin (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。


(7)c语言指令及用法扩展阅读:

函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。每一个指针要求非空,并且与字符串中的格式符一一顺次对应。

发展:

使用scanf函数进行输入,必须指定输入的数据的类型和格式,不仅繁琐复杂,而且很容易出错。C++保留scanf只是为了和C兼容。

以便过去用C语言写的程序可以在C++的环境下运行。C++的编程人员都愿意使用cin进行输入,很少使用scanf。

但是scanf有一个明显的优点,速度比cin函数快。