本文目录一览:
- 1、c语言函数用法
- 2、c语言位运算符的用法
- 3、C语言中char的用法
- 4、c语言string的用法大全
- 5、C语言中的char具体用法
- 6、c语言int的用法
c语言函数用法
char
s1[]="abcdef",s2="bcdf";
应改为:char
s1[]="abcdef",s2[]="bcdf";
上次就说了,for语句下面只能包括一条语句(IF表达式,while,for,do
while等)如果要包括多个要用{}括起来
for(i=0;s2[i];i++)
s1[i]=s2[i];
功能是将s2的字符依次复制到S1中,也就是取代S1所有的值,
因为字符串是以'\0'结束的,(也可以用0表示字符串结束符)
所以s1[i]=0;就表示s1[i]='\0';代表字符串已复制完毕,结束了
c语言位运算符的用法
c语言位运算符的用法1
c语言位运算符的用法如下:
一、位运算符C语言提供了六种位运算符:
按位与
| 按位或
^ 按位异或
~ 取反
左移
右移
1. 按位与运算
按位与运算符""是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
例如:95可写算式如下: 00001001 (9的二进制补码)00000101 (5的二进制补码) 00000001 (1的二进制补码)可见95=1。
按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a255 运算 ( 255 的二进制数为0000000011111111)。
main(){
int a=9,b=5,c;
c=ab;
printf("a=%d/nb=%d/nc=%d/n",a,b,c);
}
2. 按位或运算
按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如:9|5可写算式如下: 00001001|00000101
00001101 (十进制为13)可见9|5=13
main(){
int a=9,b=5,c;
c=a|b;
printf("a=%d/nb=%d/nc=%d/n",a,b,c);
}
3. 按位异或运算
按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)。
main(){
int a=9;
a=a^15;
printf("a=%d/n",a);
}
4. 求反运算
求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110。
5. 左移运算
左移运算符“”是双目运算符。其功能把“ ”左边的运算数的各二进位全部左移若干位,由“”右边的数指定移动的位数,高位丢弃,低位补0。例如: a4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
6. 右移运算
右移运算符“”是双目运算符。其功能是把“ ”左边的运算数的`各二进位全部右移若干位,“”右边的数指定移动的位数。
例如:设 a=15,a2 表示把000001111右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",a);
b=a5;
b=b15;
printf("a=%d/tb=%d/n",a,b);
}
请再看一例!
main(){
char a='a',b='b';
int p,c,d;
p=a;
p=(p8)|b;
d=p0xff;
c=(p0xff00)8;
printf("a=%d/nb=%d/nc=%d/nd=%d/n",a,b,c,d);
}
c语言位运算符的用法2
C语言位运算。所谓位运算,就是对一个比特(Bit)位进行操作。比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了。
C语言提供了六种位运算符:
按位与运算()
一个比特(Bit)位只有 0 和 1 两个取值,只有参与运算的两个位都为 1 时,结果才为 1,否则为 0。例如11为 1,00为 0,10也为 0,这和逻辑运算符非常类似。
C语言中不能直接使用二进制,两边的操作数可以是十进制、八进制、十六进制,它们在内存中最终都是以二进制形式存储,就是对这些内存中的二进制位进行运算。其他的位运算符也是相同的道理。
例如,9 5可以转换成如下的运算:
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001 (1 在内存中的存储)
也就是说,按位与运算会对参与运算的两个数的所有二进制位进行运算,9 5的结果为 1。
又如,-9 5可以转换成如下的运算:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-9 5的结果是 5。
关于正数和负数在内存中的存储形式,我们已在教程《整数在内存中是如何存储的》中进行了讲解。
再强调一遍,是根据内存中的二进制位进行运算的,而不是数据的二进制形式;其他位运算符也一样。以-95为例,-9 的在内存中的存储和 -9 的二进制形式截然不同:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (-9 的二进制形式,前面多余的 0 可以抹掉)
按位与运算通常用来对某些位清 0,或者保留某些位。例如要把 n 的高 16 位清 0 ,保留低 16 位,可以进行n 0XFFFF运算(0XFFFF 在内存中的存储形式为 0000 0000 -- 0000 0000 -- 1111 1111 -- 1111 1111)。
【实例】对上面的分析进行检验。
00001. #include
00002.
00003. int main(){
00004. int n = 0X8FA6002D;
00005. printf("%d, %d, %X ", 9 5, -9 5, n 0XFFFF);
00006. return 0;
00007. }
运行结果:
1, 5, 2D
按位或运算(|)
参与|运算的两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。例如1|1为1,0|0为0,1|0为1,这和逻辑运算中的||非常类似。
例如,9 | 5可以转换成如下的运算:
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
| 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1101 (13 在内存中的存储)
9 | 5的结果为 13。
又如,-9 | 5可以转换成如下的运算:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
| 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-9 | 5的结果是 -9。
按位或运算可以用来将某些位置 1,或者保留某些位。例如要把 n 的高 16 位置 1,保留低 16 位,可以进行n | 0XFFFF0000运算(0XFFFF0000 在内存中的存储形式为 1111 1111 -- 1111 1111 -- 0000 0000 -- 0000 0000)。
【实例】对上面的分析进行校验。
00001. #include
00002.
00003. int main(){
00004. int n = 0X2D;
00005. printf("%d, %d, %X ", 9 | 5, -9 | 5, n | 0XFFFF0000);
00006. return 0;
00007. }
运行结果:
13, -9, FFFF002D
按位异或运算(^)
参与^运算两个二进制位不同时,结果为 1,相同时结果为 0。例如0^1为1,0^0为0,1^1为0。
例如,9 ^ 5可以转换成如下的运算:
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1100 (12 在内存中的存储)
9 ^ 5的结果为 12。
又如,-9 ^ 5可以转换成如下的运算:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0010 (-14 在内存中的存储)
-9 ^ 5的结果是 -14。
按位异或运算可以用来将某些二进制位反转。例如要把 n 的高 16 位反转,保留低 16 位,可以进行n ^ 0XFFFF0000运算(0XFFFF0000 在内存中的存储形式为 1111 1111 -- 1111 1111 -- 0000 0000 -- 0000 0000)。
【实例】对上面的分析进行校验。
00001. #include
00002.
00003. int main(){
00004. unsigned n = 0X0A07002D;
00005. printf("%d, %d, %X ", 9 ^ 5, -9 ^ 5, n ^ 0XFFFF0000);
00006. return 0;
00007. }
运行结果:
12, -14, F5F8002D
取反运算(~)
取反运算符~为单目运算符,右结合性,作用是对参与运算的二进制位取反。例如~1为0,~0为1,这和逻辑运算中的!非常类似。。
例如,~9可以转换为如下的运算:
~ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0110 (-10 在内存中的存储)
所以~9的结果为 -10。
例如,~-9可以转换为如下的运算:
~ 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1000 (9 在内存中的存储)
所以~-9的结果为 8。
【实例】对上面的分析进行校验。
00001. #include
00002.
00003. int main(){
00004. printf("%d, %d ", ~9, ~-9 );
00005. return 0;
00006. }
运行结果:
-10, 8
左移运算()
左移运算符用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补0。
例如,93可以转换为如下的运算:
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0100 1000 (72 在内存中的存储)
所以93的结果为 72。
又如,(-9)3可以转换为如下的运算:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1011 1000 (-72 在内存中的存储)
所以(-9)3的结果为 -72
如果数据较小,被丢弃的高位不包含 1,那么左移 n 位相当于乘以 2 的 n 次方。
【实例】对上面的结果进行校验。
00001. #include
00002.
00003. int main(){
00004. printf("%d, %d ", 93, (-9)3 );
00005. return 0;
00006. }
运行结果:
72, -72
右移运算()
右移运算符用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补 0 或 1。如果数据的最高位是 0,那么就补 0;如果最高位是 1,那么就补 1。
例如,93可以转换为如下的运算:
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001 (1 在内存中的存储)
所以93的结果为 1。
又如,(-9)3可以转换为如下的运算:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 1110 (-2 在内存中的存储)
所以(-9)3的结果为 -2
如果被丢弃的低位不包含 1,那么右移 n 位相当于除以 2 的 n 次方(但被移除的位中经常会包含 1)。
【实例】对上面的结果进行校验。
00001. #include
00002.
00003. int main(){
00004. printf("%d, %d ", 93, (-9)3 );
00005. return 0;
00006. }
运行结果:
1, -2
c语言位运算符的用法3
一、位运算符
在计算机中,数据都是以二进制数形式存放的,位运算就是指对存储单元中二进制位的运算。C语言提供6种位运算符。
二、位运算
位运算符 |~ ∧ 按优先级从高到低排列的顺序是:
位运算符中求反运算“~“优先级最高,而左移和右移相同,居于第二,接下来的顺序是按位与 ““、按位异或 “∧“和按位或 “|“。顺序为~ ∧ | 。
例1:左移运算符“”是双目运算符。其功能把“ ”左边的运算数的各二进位全部左移若干位,由“”右边的数指定移动的位数,高位丢弃,低位补0。
例如:
a4
指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
例2:右移运算符“”是双目运算符。其功能是把“ ”左边的运算数的各二进位全部右移若干位,“”右边的数指定移动的位数。
例如:
设 a=15,
a2
表示把000001111右移为00000011(十进制3)。
应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。
例3:设二进制数a是00101101 ,若通过异或运算a∧b 使a的高4位取反,低4位不变,则二进制数b是。
解析:异或运算常用来使特定位翻转,只要使需翻转的位与1进行异或操作就可以了,因为原数中值为1的位与1进行异或运算得0 ,原数中值为0的位与1进行异或运算结果得1。而与0进行异或的位将保持原值。异或运算还可用来交换两个值,不用临时变量。
如 int a=3 , b=4;,想将a与b的值互换,可用如下语句实现:
a=a∧b;
b=b∧a;
a=a∧b;
所以本题的答案为: 11110000 。
C语言中char的用法
#includestdio。h
intmain()
{
inti;
charc;//定义一个char类型的变量。
c='a';//赋值
for(i=0;i26;i++){
printf(“%c”,c);//输出一个字符用%c,
c++;//charc增加1,依次可以得到:abcdef。。。。z
}
printf(“\n”);
if(c='z')
printf(“stillasmallletter。\n”);
else
printf(“Notasmallletter。\n”);
scanf(“%c”,c);//输入一个字符到c中。
charstr[10]=“AString”;//定义一个字符数组,它的初值是“AString”
for(i=0;str[i]!='\0';i++);//计算str的长度。
printf(“Thelengthofstris:%d\n”,i);
}
扩展资料
1、声明字符型变量
字符型变量的声明方式和其它类型变量的声明方式一样:
chargood;
charbetter,best;
以上代码声明了三个字符型变量:good、better,和best。
2、字符常量与初始化
可以使用以下语句来初始化字符型变量:
charch='A';
这个语句把ch的值初始化为A的编码值。在这个语句中,'A'是字符常量。C语言中,使用单引号把字符引|起来就构成字符常量。
c语言string的用法大全
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C 语言string的用法有哪些呢,请看看下面我为你整理 总结 的c语言string的用法大全_C语言中string使用 方法 。
c语言string的用法
函数原型:char *strdup(const char *s)
函数功能:字符串拷贝,目的空间由该函数分配
函数返回:指向拷贝后的字符串指针
参数说明:src-待拷贝的源字符串
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
#includealloc.h
intmain()
{
char*dup_str,*string="abcde";
dup_str=strdup(string);
printf("%s",dup_str);
free(dup_str);
return0;
}
@函数名称:strcpy
函数原型:char* strcpy(char* str1,char* str2);
函数功能:把str2指向的字符串拷贝到str1中去
函数返回:返回str1,即指向str1的指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
charstring[10];
char*str1="abcdefghi";
strcpy(string,str1);
printf("thestringis:%s\n",string);
return0;
}
@函数名称:strncpy
函数原型:char *strncpy(char *dest, const char *src,intcount)
函数功能:将字符串src中的count个字符拷贝到字符串dest中去
函数返回:指向dest的指针
参数说明:dest-目的字符串,src-源字符串,count-拷贝的字符个数
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
char*src="bbbbbbbbbbbbbbbbbbbb";//20'b's
chardest[50]="aaaaaaaaaaaaaaaaaaaa";//20'a's
puts(dest);
strncpy(dest,src,10);
puts(dest);
return0;
}
输出:
[cpp] view plain
/*******************************************
aaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbaaaaaaaaaa
*******************************************/
注意:strncpy只复制指定长度的字符,不会自动在末尾加'\0'。若指定长度超过源字符串长度,不够的部分补‘\0’,
@函数名称:strcat
函数原型:char* strcat(char * str1,char * str2);
函数功能:把字符串str2接到str1后面,str1最后的'\0'被取消
函数返回:str1
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
charbuffer[80];
strcpy(buffer,"Hello");
strcat(buffer,"world");
printf("%s\n",buffer);
return0;
}
@函数名称:strncat
函数原型:char *strncat(char *dest, const char *src, size_t maxlen)
函数功能:将字符串src中前maxlen个字符连接到dest中
函数返回:
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
charbuffer[80];
intmain()
{
strcpy(buffer,"Hello");
strncat(buffer,"world",8);
printf("%s\n",buffer);
strncat(buffer,"*************",4);
printf("%s\n",buffer);
return0;
}
注意:与strncpy不同的是,strncat会自动在末尾加‘\0’,若指定长度超过源字符串长度,则只复制源字符串长度即停止
@函数名称:strcmp
函数原型:int strcmp(char * str1,char * str2);
函数功能:比较两个字符串str1,str2.
函数返回:str1str2,返回负数;str1=str2,返回 0;str1str2,返回正数.
参数说明:
所属文件:string.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
char*buf1="aaa",*buf2="bbb",*buf3="ccc";
intptr;
ptr=strcmp(buf2,buf1);
if(ptr0)
printf("buffer2isgreaterthanbuffer1\n");
else
printf("buffer2islessthanbuffer1\n");
ptr=strcmp(buf2,buf3);
if(ptr0)
printf("buffer2isgreaterthanbuffer3\n");
else
printf("buffer2islessthanbuffer3\n");
return0;
}
@函数名称:strncmp
函数原型:int strncmp(char *str1,char *str2,int count)
函数功能:对str1和str2中的前count个字符按字典顺序比较
函数返回:小于0:str1str2,等于0:str1=str2,大于0:str1str2
参数说明:str1,str2-待比较的字符串,count-比较的长度
所属文件:string.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
charstr1[]="aabbc";//
charstr2[]="abbcd";//
//为使测试程序更简练,此处假定了strncmp只返回-1,0,1三个数
charres_info[]={'','=',''};
intres;
//前1个字符比较
res=strncmp(str1,str2,1);
printf("1:str1%cstr2\n",res_info[res+1]);
//前3个字符比较
res=strncmp(str1,str2,3);
printf("3:str1%cstr2\n",res_info[res+1]);
}
输出:
[cpp] view plain
/****************************************
1:str1=str2
3:str1str2
*****************************************/
@函数名称:strpbrk
函数原型:char *strpbrk(const char *s1, const char *s2)
函数功能:得到s1中第一个“同时也出现在s2中”字符的位置指针
函数返回:位置指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
char*p="Findallvowels";
p=strpbrk(p+1,"aeiouAEIOU");
while(p)
{
printf("%s\n",p);
p=strpbrk(p+1,"aeiouAEIOU");
}
return0;
}
输出:
[cpp] view plain
/**************************************
indallvowels
allvowels
owels
els
**************************************/
@函数名称:strcspn
函数原型:int strcspn(const char *s1, const char *s2)
函数功能:统计s1中从头开始直到第一个“来自s2中的字符”出现的长度
函数返回:长度
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
printf("%d\n",strcspn("abcbcadef","cba"));
printf("%d\n",strcspn("xxxbcadef","cba"));
printf("%d\n",strcspn("123456789","cba"));
return0;
}
输出:
[cpp] view plain
/************************
3
9
************************/
@函数名称:strspn
函数原型:int strspn(const char *s1, const char *s2)
函数功能:统计s1中从头开始直到第一个“不来自s2中的字符”出现的长度
函数返回:位置指针
参数说明:
所属文件:string.h
[html] view plain
#includestdio.h
#includestring.h
#includealloc.h
intmain()
{
printf("%d\n",strspn("abcbcadef","cba"));
printf("%d\n",strspn("xxxbcadef","cba"));
printf("%d\n",strspn("123456789","cba"));
return0;
}
输出:
[cpp] view plain
/************************
6
************************/
@函数名称:strchr
函数原型:char* strchr(char* str,char ch);
函数功能:找出str指向的字符串中第一次出现字符ch的位置
函数返回:返回指向该位置的指针,如找不到,则返回空指针
参数说明:str-待搜索的字符串,ch-查找的字符
所属文件:string.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
char*str="Thisisastring!";
charch;
char*p;
while(1)
{
printf("Pleaseinputachar:");
ch=getchar();
p=strchr(str,ch);
if(p)
printf("%cisthe%dcharacterof\"%s\"\n",ch,(int)(p-str+1),str);
else
printf("Notfound!\n");
printf("PressESCtoquit!\n\n");
if(27==getch())
break;
fflush(stdin);
}
return0;
}
运行结果:
[cpp] view plain
/********************************************
Pleaseinputachar:i
iisthe3characterof"Thisisastring!"
PressESCtoquit!
Pleaseinputachar:l
Notfound!
PressESCtoquit!
Pleaseinputachar:s
sisthe4characterof"Thisisastring!"
PressESCtoquit!
**********************************************/
@函数名称:strrchr
函数原型:char *strrchr(const char *s, int c)
函数功能:得到字符串s中最后一个含有c字符的位置指针
函数返回:位置指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
charstring[15];
char*ptr,c='r';
strcpy(string,"Thisisastring");
ptr=strrchr(string,c);
if(ptr)
printf("Thecharacter%cisatposition:%d",c,ptr-string);
else
printf("Thecharacterwasnotfound");
return0;
}
@函数名称:strstr
函数原型:char* strstr(char* str1,char* str2);
函数功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)
函数返回:返回该位置的指针,如找不到,返回空指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
char*str1="OpenWatcomC/C++",*str2="Watcom",*ptr;
ptr=strstr(str1,str2);
printf("Thesubstringis:%s\n",ptr);
return0;
}
输出:
The substringis:Watcom C/C++
@函数名称:strrev
函数原型:char *strrev(char *s)
函数功能:将字符串中的所有字符颠倒次序排列
函数返回:指向s的指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
charforward[]="string";//原文中定义为char*是不对的,指向代码段的指针内容是不可变的
printf("Beforestrrev():%s",forward);
strrev(forward);
printf("Afterstrrev():%s",forward);
return0;
}
输出:
[cpp] view plain
/************************************
Beforestrrev():string
Afterstrrev():gnirts
************************************/
@函数名称:strnset
函数原型:char *strnset(char *s, int ch, size_t n)
函数功能:将字符串s中前n个字符设置为ch的值
函数返回:指向s的指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
charstring[]="aaaaaaaaaaaaaaaaaaaaaaa";
charletter='x';
printf("stringbeforestrnset:%s\n",string);
strnset(string,letter,10);
printf("stringafterstrnset:%s\n",string);
return0;
}
输出:
[cpp] view plain
/*************************************************
stringbeforestrnset:aaaaaaaaaaaaaaaaaaaaaaa
stringafterstrnset:xxxxxxxxxxaaaaaaaaaaaaa
*************************************************/
@函数名称:strset
函数原型:char *strset(char *s, int ch)
函数功能:将字符串s中所有字符设置为ch的值
函数返回:指向s的指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
charstring[10]="123456789";
charsymbol='c';
printf("Beforestrset():%s",string);
strset(string,symbol);
printf("Afterstrset():%s",string);
return0;
}
@函数名称:strtok
函数原型:char *strtok(char *s1, const char *s2)
函数功能:分解s1字符串为用特定分隔符分隔的多个字符串(一般用于将英文句分解为单词)
函数返回:字符串s1中首次出现s2中的字符前的子字符串指针
参数说明:s2一般设置为s1中的分隔字符
规定进行子调用时(即分割s1的第二、三及后续子串)第一参数必须是NULL
在每一次匹配成功后,将s1中分割出的子串位置替换为NULL(摘下链中第一个环),因此s1被破坏了
函数会记忆指针位置以供下一次调用
所属文件:string.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
char*p;
char*buffer;
char*delims={".,"};
buffer=strdup("Findwords,allofthem.");
printf("%s\n",buffer);
p=strtok(buffer,delims);
while(p!=NULL){
printf("word:%s\n",p);
p=strtok(NULL,delims);
}
printf("%s\n",buffer);
return0;
}//根据测试,可以随时给strtok的第一个参数输入一个新的字符串,开始新字符串的分隔
PS:根据测试,可以随时给strtok的第一个参数输入一个新的字符串,开始新字符串的分隔
@函数名称:strupr
函数原型:char *strupr(char *s)
函数功能:将字符串s中的字符变为大写
函数返回:
参数说明:
所属文件:string.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
charstring[]="abcdefghijklmnopqrstuvwxyz",*ptr;//会影响原字符串的内存,用char[]来声明
ptr=strupr(string);
printf("%s",ptr);
return0;
}
@函数名称:strlwr
函数原型:char *strlwr(char *s)
函数功能:将字符串中的字符变为小写字符
函数返回:指向s的指针
参数说明:
所属文件:string.h
[cpp] view plain
#includestring.h
intmain()
{
charstr[]="HOWTOSAY";
printf("%s",strlwr(str));
return0;
}
@函数名称:strerror
函数原型:char *strerror(int errnum)
函数功能:得到错误信息的内容信息
函数返回:错误提示信息字符串指针
参数说明:errnum-错误编号
所属文件:string.h
[cpp] view plain
#includestdio.h
#includeerrno.h
intmain()
{
char*buffer;
buffer=strerror(errno);
printf("Error:%s",buffer);
return0;
}
@函数名称:memcpy
函数原型:void *memcpy(void *dest, const void *src, size_t n)
函数功能:字符串拷贝
函数返回:指向dest的指针
参数说明:src-源字符串,n-拷贝的最大长度
所属文件:string.h,mem.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
charsrc[]="******************************";
chardest[]="abcdefghijlkmnopqrstuvwxyz0123456709";
char*ptr;
printf("destinationbeforememcpy:%s\n",dest);
ptr=memcpy(dest,src,strlen(src));
if(ptr)
printf("destinationaftermemcpy:%s\n",dest);
else
printf("memcpyfailed");
return0;
}
输出:
[cpp] view plain
/*************************************************************
destinationbeforememcpy:abcdefghijlkmnopqrstuvwxyz0123456709
destinationaftermemcpy:******************************456709
**************************************************************/
@函数名称:memccpy
函数原型:void *memccpy(void *dest, const void *src, int c, size_t n)
函数功能:字符串拷贝,到指定长度或遇到指定字符时停止拷贝
函数返回:
参数说明:src-源字符串指针,c-中止拷贝检查字符,n-长度,dest-拷贝底目的字符串指针
所属文件:string.h,mem.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
char*src="Thisisthesourcestring";
chardest[50];
char*ptr;
ptr=memccpy(dest,src,'c',strlen(src));
if(ptr)
{
*ptr='\0';
printf("Thecharacterwasfound:%s",dest);
}
else
printf("Thecharacterwasn'tfound");
return0;
}
输出:
[cpp] view plain
/*****************************************
Thecharacterwasfound:Thisisthesourc
*****************************************/
PS:指定字符被复制到dest中,memccpy返回了dest中指定字符的下一处的地址,返回NULL表示未遇到指定字符
@函数名称:memchr
函数原型:void *memchr(const void *s, int c, size_t n)
函数功能:在字符串中第开始n个字符中寻找某个字符c的位置
函数返回:返回c的位置指针,返回NULL时表示未找到
参数说明:s-要搜索的字符串,c-要寻找的字符,n-指定长度
所属文件:string.h,mem.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
charstr[17];
char*ptr;
strcpy(str,"Thisisastring");
ptr=memchr(str,'r',strlen(str));
if(ptr)
printf("Thecharacter'r'isatposition:%d",ptr-str);
else
printf("Thecharacterwasnotfound");
return0;
}
@函数名称:memcmp
函数原型:int memcmp(const void *s1, const void *s2,size_t n)
函数功能:按字典顺序比较两个串s1和s2的前n个字节
函数返回:0,=0,0分别表示s1,=,s2
参数说明:s1,s2-要比较的字符串,n-比较的长度
所属文件:string.h,mem.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
char*buf1="ABCDE123";
char*buf2="abcde456";
intstat;
stat=memcmp(buf1,buf2,5);
printf("Thestringstoposition5are");
if(stat)printf("not");
printf("thesame\n");
return0;
}
@函数名称:memicmp
函数原型:int memicmp(const void *s1, const void *s2, size_t n)
函数功能:按字典顺序、不考虑字母大小写对字符串s1,s2前n个字符比较
函数返回:0,=0,0分别表示s1,=,s2
参数说明:s1,s2-要比较的字符串,n-比较的长度
所属文件:string.h,mem.h
[cpp] view plain
#includestdio.h
#includestring.h
intmain()
{
char*buf1="ABCDE123";
char*buf2="abcde456";
intstat;
stat=memicmp(buf1,buf2,5);
printf("Thestringstoposition5are");
if(stat)printf("not");
printf("thesame");
return0;
}
输出:
[cpp] view plain
/**************************************
Thestringstoposition5arethesame
***************************************/
@函数名称:memmove
函数原型:void *memmove(void *dest, const void *src, size_t n)
函数功能:字符串拷贝
函数返回:指向dest的指针
参数说明:src-源字符串,n-拷贝的最大长度
所属文件:string.h,mem.h
[cpp] view plain
#includestring.h
#includestdio.h
intmain()
{
chardest[40]="abcdefghijklmnopqrstuvwxyz0123456789";
printf("destinationpriortomemmove:%s\n",dest);
memmove(dest+1,dest,35);
printf("destinationaftermemmove:%s",dest);
return0;
}
PS:与memcpy不同的是,memmove可以处理目的字符串与源字符串地址空间出现重叠的情况,可保证待复制的内容不被破坏。
@函数名称: memset
函数原型: void *memset(void *s, int c, size_t n)
函数功能: 字符串中的n个字节内容设置为c
函数返回:
参数说明: s-要设置的字符串,c-设置的内容,n-长度
所属文件: string.h,mem.h
[cpp] view plain
#includestring.h
#includestdio.h
#includemem.h
intmain()
{
charbuffer[]="Helloworld";
printf("Bufferbeforememset:%s/n",buffer);
memset(buffer,'*',strlen(buffer)-1);
printf("Bufferaftermemset:%s",buffer);
return0;
}
c语言string的用法大全相关 文章 :
★ c语言string的用法
★ c语言的用法
★ Linux C语言字符与字符串处理
★ c语言中strcmp的用法
★ c语言大括号的用法
★ c语言位运算符的用法
★ c语言char的用法
★ c语言中sort的用法详解
★ c语言中int的用法
★ c语言map的用法
C语言中的char具体用法
C语言中char用于定义字符类型变量或字符指针变量,例如“char a;”则定义了变量a是字符类型,“char *a;”则定义了变量a是字符指针类型。
char是C语言整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed,但char在标准中不指定为signed/unsigned,编译器可以实现为带符号的,也可以实现为不带符号的。
关于char还有一个特殊的语言就是char *,它在C语言中有专门的语义,既不同于signed char *,也不同于unsigned char *,专门用于指以'\0'为结束的字符串。
C语言中char的不同应用:
1、字符型(char)
字符型(char)用于储存字符(character),如英文字母或标点。严格来说,char 其实也是整数类型(integer type),因为 char 类型储存的实际上是整数,而不是字符。计算机使用特定的整数编码来表示特定的字符。
C 语言中保证 char 占用空间的大小足以储存系统所用的基本字符集的编码。C 语言定义一个字节(byte)的位数为 char 的位数,所以一个字节可能是 16 位,也可能是 32 位,而不仅仅限于 8 位。
2、声明字符型变量
字符型变量的声明方式和其它类型变量的声明方式一样:
char good;
char better, best;
以上代码声明了三个字符型变量:good、better,和 best。
char是分配1字节,存储的是ASCII码,A:65,a:97;
在命名char类型是不要使用双引号,c中必须单引号,在java中就高级点了什么都可以。
补充:printf()输出时对于char有点不同,使用“”%d“是输出字符代表的ASCII码。使用:%c,是输出单个字符;使用%s:就是输出多个字符了。
扩展资料:
C语言中的基本类型:
1、算数类型:
它们是算术类型,包括两种类型:整数类型和浮点类型。
2 枚举类型:
它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。
3 void 类型:
类型说明符 void 表明没有可用的值。
4 派生类型:
它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。
数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。在本章节接下来的部分我们将介绍基本类型,其他几种类型会在后边几个章节中进行讲解。
void 类型:
void 类型指定没有可用的值。它通常用于以下三种情况下:
1、函数返回为空:
C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status)。
2、函数参数为空:
C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void)。
3、指针指向:
类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。
参考资料来源:百度百科-char
c语言int的用法
C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负。int 是整型之一,一般被称为整型。以后,在不产生歧义的情况下,我们把整数类型和 int 都称为整型。下面我们来看看c语言int的用法。 1. 整型 int int 代表有符号整数,也就是说,用 int 声明的变量可以是正数,可以是负数,也可以是零,但是只能是整数。标准规定 int 的最小取值范围是 -32767 到 32767。int 的取值范围因机器而异,但是一定要大于或者等于 -32767 到 32767。一般来说,int 占用一个字的内存空间。因此,字长为 16 位(Bit)的旧式 IBM 兼容机使用 16 位来储存整型 int ,取值范围是 -32768 到 32767 。目前的个人电脑一般都是 32 位字长的,这些电脑中,int 一般也是 32 位的,取值范围是 -2147483648 到 2147483647。对于使用 64 位 CPU 的电脑,使用更多位储存 int 也是很自然的事情,取值范围当然也会更大。 2. 声明 int 类型的变量 正如我们在以前的教程里看到的那样,int 用于声明整型变量:以 int 打头,后面跟着变量的名字,最后以分号(;)结束。例如: int erns; /* 声明一个变量 */ /* 注意:一定要用逗号(,),不能用分号(;)*/ int hogs, cows, goats; /* 声明三个变量 */ 以上声明创建了变量,但是没有给它们提供“值(value)”。在前面的教程中,我们已经用了两种方法使变量获得“值”。一种是赋值:cows = 500; 。另一种是使用 scanf 函数:scanf( "%d", goats ); 。下面我们来学习第三种方法。 3. 初始化变量 初始化变量是指给变量赋初值:声明变量的时候,在变量名的后面写上等号(=),然后写下你希望赋予变量的“值”。例如: int hogs = 21; int cows = 32, goats = 14; int dogs, cats = 94; 以上声明创建了变量,并且为这些变量分配了空间,同时也赋了初值。注意,第三行中只有 cats 被初始化为 94,而 dogs 没有被初始化!如下图: 4. int 常量 上面的例子中,21、32、14,以及 94 都是整数常量。C 语言中,整数常量的默认类型是 int。如果整数常量的大小超过了 int 的取值范围,那么编译器将会把这个整数常量当作 long int 类型来处理,这个我们后面还会讲到。21、32、14 和 94 都在 int 的取值范围之内,因此它们都是 int 常量。 5. 输出 int 型数据 我们可以用 printf 函数来输出 int 型数据。正如我们在前面的教程中看到的那样,占位符 %d 代表输出的是 int 型数据,它告诉 printf 函数在什么地方输出相应的 int 型数据。%d 也被称为格式限定符(format specifier),因为它指定了 printf 函数应该使用什么形式来输出数据。printf 函数的第一个参数只能是字符串,这个字符串被称为格式串(format string)。格式串中有多少个 %d,我们就应该相应地提供多少个 int 型参数给 printf 函数。int 型参数可以是 int 型变量,int 型常量,以及结果为 int 型的表达式等。例如: int year = 2005; /* year 是 int 型变量 */ printf( "Today is %d-%d-%d ", year, 9, 20 + 9 ); /* 20 + 9 是加法表达式 */ 保证格式限定符的数目和参数数目一致是我们的责任,编译器不负责捕捉这种错误!例如: #include stdio.h int main(void) { int ten = 10, two = 2; printf("%d minus %d is %d ", ten ); /* 少写了两个参数 */ getchar(); /* 等待用户按回车 */ return 0; } 这个程序可以通过编译,但是运行结果将会出乎意料,因为我们少写了两个参数。标准规定,如果格式限定符的数目大于参数数目,则 printf 函数的行为是未定义的;如果参数数目大于格式限定符的数目,则多余的参数会被忽略。 6. 八进制(octal)和十六进制(hexadecimal) C 语言中,整数常量默认是十进制(decimal)整数。通过在整数常量前面加上特定的前缀,可以把它设定为八进制或者十六进制整数。前缀 0x 或者 0X 把整数常量设定为十六进制整数。注意,是数字 0 ,而不是字母 O ,别搞错了哦!例如:十进制的 16 用十六进制来表示是 0x10 或者 0X10 。在整数常量前面加上前缀 0 ,表示它是八进制整数。注意,是数字 0 ,而不是字母 O 。例如:十进制的 16 表示为八进制就是 020 。 7. 以八进制或者十六进制形式输出数据 使用格式限定符 %o 可以以八进制的形式输出整数。注意,是小写字母 o ,不是数字 0 。使用 %x 或者 %X 可以以十六进制的形式输出整数。小写 x 表示输出使用小写字母,大写 X 表示输出使用大写字母。使用 %#o,%#x 或者 %#X,得到的输出将包括前缀 0,0x 或者 0X。例如: #include stdio.h int main(void) { int x = 200; printf("dec = %d; octal = %o; hex = %x; HEX = %X ", x, x, x, x); printf("dec = %d; octal = %#o; hex = %#x; HEX = %#X ", x, x, x, x); getchar(); return 0; } 这个程序的输出是: dec = 200; octal = 310; hex = c8; HEX = C8 dec = 200; octal = 0310; hex = 0xc8; HEX = 0XC8 1. 其它整数类型 int 是 C 语言的基本整数类型,可以满足我们处理一般数据的需求。C 语言还提供了四个可以修饰 int 的关键字:short、long、signed,以及 unsigned。利用这四个关键字,C 语言标准定义了以下整数类型: 1) short int(可简写为 short),和 int 一样,也是有符号整数 2) long int(简写:long),有符号整数 3) long long int(简写:long long),C99 标准添加的类型, 有符号整数 4) unsigned int(简写:unsigned),无符号整数,不能表示负数 5) unsigned long int(简写:unsigned long),无符号整数, 不能表示负数 6) unsigned short int(简写:unsigned short),无符号整数, 不能表示负数 7) unsigned long long int(简写:unsigned long long), C99 添加的类型,无符号整数 8) 所有没有标明 unsigned 的整数类型默认都是有符号整数。 在这些整数类型前面加上 signed 可以使读者更清楚地知道 这些是有符号整数,尽管有没有 signed 都表示有符号整数。 例如:signed int 等同于 int 。 一般我们把 short 称为短整型,把 long 称为长整型,把 long long 称为超长整型,把 int 称为整型。unsigned 打头的那些整数类型统称为无符号整型。例如:我们称 unsigned short 为无符号短整型。以此类推。 2. 声明方式 这些整数类型的声明方式与 int 类型的声明方式一样。例如: long int estine; long johns; short int erns; short ribs; unsigned int s_count; unsigned players; unsigned long headcount; unsigned short yesvotes; long long ago; /* C99 特有 */ unsigned long long ego; /* C99 特有 */ 如果您的编译器不支持 C99 标准,那就不能使用 long long 和 unsigned long long。 3. 取值范围(表示范围) 标准也规定了这些整数类型的最小取值范围。short 的最小表示范围和 int 一样,都是 -32767 到 32767 。也就是 -(2^15 - 1)到(2^15 - 1)。其中,2^15表示 2 的 15 次方。类似地,2 的 20 次方记作 2^20 ,以此类推。注意:C 语言中 2^15 并不表示 2 的 15 次方,为了书写方便,我们姑且这么表示。long 的最小取值范围是 -2147483647 到 2147483647 。也就是 -(2^31 - 1) 到 (2^31 - 1) 。unsigned short的最小表示范围和unsigned int 一样,都是 0 到 65535(2^16 - 1)。unsigned long 的最小取值范围是 0 到 4294967295(2^32 - 1)。long long的最小取值范围是 -9223372036854775807(-(2^63 - 1))到 9223372036854775807(2^63 - 1);unsigned long long 是 0 到 18446744073709551615(2^64 - 1)。 标准规定,int 的表示范围不能小于 short 的表示范围,long 的表示范围不能小于 int 的表示范围。这就是说 short 型变量占用的空间可能比 int 型变量少,而 long 型变量占用的空间可能比 int 型变量多。16 位(bit)的计算机中,int 和 short 一般都是 16 位,而 long 是 32位;32位的计算机中,short一般是 16 位,而long和int是 32位。TC2(16位的编译器)中,int是16位的;而 Dev-C++(32 位的编译器)中,int 是 32 位的。 使用 unsigned int 声明的变量只能表示非负整数(0 和正整数)。如果 int 是 16 位的话,那么 unsigned int 的表示范围是 0 到 65535(2^16 - 1)。这是因为 unsigned 不需要符号位,可以把 16 个位全都用于表示整数。而 int 需要一个位作为符号位,用于表示正负,只有 15 个位用于表示整数。 目前,long long 一般 64 位,long 是 32 位,short 是 16 位,而 int 或者 16 位,或者 32 位。具体某个编译器到底使用多少位来表示这些类型,我们可以用运算符 sizeof 来获取。例如: printf( "%lu ", (unsigned long)sizeof(int) * 8 ); /* 输出 int 的位数 */ printf( "%zu ", sizeof(short) * 8 ); /* 输出 short 的位数 */ sizeof 运算符返回其操作数占用空间的大小,以字节(Byte)为单位。注意,C 定义字节的大小为 char 类型的大小。char 通常是 8 位(bit)的,当然也可以更大。这里我们假设 char 是 8 位的。点击查看 char 类型详细介绍 sizeof 的用法我们以后会讲到,现在只要有个印象就好了。第二句中的 %zu 是 C99 特有的,如果您的编译器不支持 C99(准确地说,应该是如果您的编译器使用的库函数不支持 C99),运行结果将会出错。 4. 整数类型的选择 如果您要处理的只是非负整数,那么应该优先使用 unsigned 打头的那些整数类型。如果您要处理的整数超出了 int 所能表示的范围,并且您的编译器中,long 的表示范围比 int 大,那就使用 long。不过,若非必要,尽量不要用 long,因为它可能会降低程序运行效率。有一点要注意:如果您的编译器中,long 和 int 都是 32 位的,并且您需要使用 32 位整数,那么应该用 long,而不要用 int。只有这样,我们的程序才可以安全地移植到 16 位的计算机,因为 16 位的计算机中,int 一般也是 16 位的。类似地,如果您需要使用 64 位整数,那就用 long long。如果 int 是 32 位的话,那么使用 short 可以节省空间,不过您得确保您要处理的整数不会超出 short 的表示范围。这种“节省”对内存大的计算机来说,是没什么意义的。 5. long 型常量和 long long 型常量 一般来说,整数常量是被当作 int 类型来存储的。如果我们使用的整数常量超出了 int 的表示范围,C 语言规定编译器自动使用 unsigned int 来处理这个常量。如果 unsigned 也不足以表示这个常量的话,编译器就会用 long。如果还表示不了的话,那就依次用 unsigned long,long long,unsigned long long。如果 unsigned long long 也表示不了,那么编译器就没辙了。注意:long long 和 unsigned long long 是 C99 特有的。例如:如果 int 是 16 位的话,它就表示不了常量 1000000。编译器会使用 long 来处理这个常量,因为 unsigned int 也表示不了 1000000 。 同样,十六进制和八进制整数常量通常也是被作为 int 来处理。但是,当我们使用的常量超出了 int 的表示范围后,编译器会依次使用unsigned int,long,unsigned long,long long 和 unsigned long long。直到所使用的类型足以表示那个常量为止。 有时,我们使用的是较小的常量,但是我们希望这个常量被当作 long 来处理,这就需要在这个常量后面加上后缀 l(小写字母 l)或者 L(大写字母 L)。我们应该避免使用 l ,因为 l 容易和数字 1 混淆。例如:整数常量 7 是被作为 int 来处理的,但整数常量 7L(或者 7l)是被作为 long 来处理的。类似地,在整数常量后面加上后缀 ll 或者 LL ,这个常量就会被当作 long long 来处理。例如:3LL 。如果想使用无符号整数常量的话,还要配合使用后缀 u 或者 U 。例如:2u,3U,4Lu,5ul,6LU,7LLU,8Ull,9uLL 。 这些后缀也可以用于十六进制和八进制整数常量。例如:020L,010LL,0x30uL,0x40ull 。 1. 输出各种整数类型的变量 输出不同类型的整数,需要使用不用的格式限定符。输出 unsigned int 类型的整数,要用 %u 。输出 long ,要用 %ld;如果要以十六进制或者八进制形式输出,那就用 %lx(或者%lX)或者 %lo。注意:虽然整数常量的后缀使用大写或者小写英文字母都没关系,但是它们格式限定符必须使用小写!如果我们要输出 short 类型的整数,可以在 %d 中间加上前缀 h,也就是%hd;同理,%ho 和 %hx(或者 %hX )分别表示以八进制或十六进制形式输出。前缀 h 和 l 可以和 u 组合,表示输出无符号整数。例如:%lu 表示输出 unsigned long 类型的整数;%hu 表示输出unsigned short类型的整数。如果您的编译器支持C99,可以使用 %lld 和 %llu 分别表示输出 long long 和 unsigned long long 。下面我们来看一个输出各种类型整数的程序: #include stdio.h int main(void) { unsigned int un = 3000000000; /* 我使用的编译器 int 是 32 位的 */ short end = 200; /* 而 short 是 16 位的 */ long big = 65537; printf("un = %u and not %d ", un, un); printf("end = %hd and %d ", end, end); printf("big = %ld and not %hd ", big, big); printf("Press ENTER to quit..."); getchar(); return 0; } 使用 Dev-C++ 编译运行这个程序输出结果如下: un = 3000000000 and not -1294967296 end = 200 and 200 big = 65537 and not 1 Press ENTER to quit... 这个程序表明,错误使用格式限定符会导致意想不到的输出。首先,错误使用 %d 来做无符号整型变量 un 的格式限定符,导致输出的是负数。这是因为我的计算机使用相同的二进制形式来表示 3000000000 和 -129496296 ,而计算机只认识二进制。所以,如果我们使用 %u 告诉 printf 输出无符号整数,输出的就是 3000000000;如果我们误用了 %d,那么输出的就是一个负数。不过,如果我们把代码中的 3000000000 改成 96 的话,输出就不会出现异常。因为 96 没有超出 int 的表示范围。 然后,对于第二个 printf,无论我们使用 %hd 还是 %d,输出的结果都是一样的。这是因为 C 语言标准规定,当 short 类型值传递给函数时,要自动转化成 int 类型值。之所以转化成 int,是因为 int 被设计为计算机处理效率最高的整数类型。所以,对于 short 和 int 大小不同的计算机来说,把变量 end 转化成 int 类型再传递给函数,速度更快。如此说来,h 好像没有存在意义。其实不然。我们可以用 %hd 来看看较大的整数类型被截断成 short 类型的时候会是什么样的。 而第三个 printf,由于误用 %hd,导致输出是 1。这是因为,如果 long 是 32 位的话,65537 的二进制形式便是 0000 0000 0000 0001 0000 0000 0000 0001,而 %hd 命令 printf 输出 short 类型的值,从而导致 printf 只处理 16 位数据(假设 short 是 16 位的),最终导致输出 1。 在前面的教程里,我们说过,保证格式限定符的数目和参数数目一致是我们的责任。同样,保证格式限定符的类型和参数类型一致也是我们的责任!正如上面所说的那样,错误使用格式限定符会导致意想不到的输出!标准规定,如果任意参数和与其对应的格式限定符类型不一致,则 printf 的行为是未定义的;如果格式限定符本身就是非法的,则 printf 的行为也是未定义的。 2. 整数溢出 首先请看以下程序: #include stdio.h int main(void) { /* 32 位 int 表示范围的上限和下限 */ int i = 2147483647, j = -2147483648; unsigned int k = 4294967295, l = 0; printf("%d %d %d %d ", i, i+1, j, j-1); printf("%u %u %u %u %u ", k, k+1, k+2, l, l-1); printf("Press ENTER to quit..."); getchar(); return 0; } 使用 Dev-C++ 编译运行这个程序输出结果如下: 2147483647 -2147483648 -2147483648 2147483647 4294967295 0 1 0 4294967295 Press ENTER to quit... 本例中,i+1 是负数,j-1 是正数,k+1 是 0,l-1 是 4294967295 。这是因为加减运算过后,它们的值超出了它们对应的那种整数类型的表示范围,我们把这种现象称为溢出。 unsigned int 型变量的值如果超过了上限,就会返回 0,然后从 0 开始增大。如果低于下限,那么就会到达 unsigned 型的上限,然后从上限开始减小。就好像一个人绕着跑道跑步一样,绕了一圈,又返回出发点。一般,int 型变量溢出的话,会变成负数,或者正数。 对于 unsigned 类型的整数,它们溢出时的情况一定和上面描述的一样,这是标准规定的。但是标准并没有规定有符号整数溢出时会出现什么情况。这里描述的有符号整数溢出时出现的情况是最常见的,但是在别的计算机,使用别的编译器,也可能出现不同的情况。