- c语言实习总结 推荐度:
- c语言课程设计个人总结 推荐度:
- c语言程序设计实验报告 推荐度:
- c语言程序设计心得体会 推荐度:
- c语言程序设计的实验报告 推荐度:
- 相关推荐
在学习中,大家都背过各种知识点吧?知识点在教育实践中,是指对某一个知识的泛称。相信很多人都在为知识点发愁,下面是小编为大家整理的c语言字符型基础知识,仅供参考,希望能够帮助到大家。
文字处理是计算机的一个重要应用领域,这个应用领域的程序必须能够使用和处理字符形式的数据。在c语言中,字符型数据包括字符和字符串两种,例如'a'是字符,而"windows" 是字符串。
字符型数据在计算机中存储的是字符的ascii码(ascii码表见附录a),一个字符的存储占用一个字节。因为ascii码形式上就是0 到255之间的整数,因此c语言中字符型数据和整型数据可以通用。例如,字符"a"的ascii码值用二进制数表示是1000001,用十进制数表示是65,在计算机中的存储示意图见图3-6。由图可见,字符"a"的存储形式实际上就是一个整型数65,所以它可以直接与整型数据进行算术运算、混合运算,可以与整型变量相互赋值,也可以将字符型数据以字符或整数两种形式输出。以字符形式输出时,先将ascii码值转换为相应的字符,然后再输出;以整数形式输出时,直接将ascii码值作为整数输出。
字符常量亦被称为字符常数。c语言中字符常量是括在一对单引号内的一个字符。 例如:'x'、'b'、'b'、'$'、'?'、' '(表示空格字符)、'3'都是字符常量,注意其中'b'和'b'是不同的字符常量。
除了以上形式的字符常量外,对于常用的但却难以用一般形式表示的不可显示字符,c语言提供了一种特殊的字符常量,即用一个转义标识符""开头,后续需要的转义字符来表示。常用的转义字符序列的字符常量见表3-4。
转义字符是一种特殊形式的字符常量,其意思是将转义符""后的字符原来的含义进行转换,变成某种另外特殊约定的含义。
例如,转义字符" "中的n已不代表字符常量"n",由于n前面是转义符"",所以n就转义成换行。转义字符"15"是"ddd"形式的转义字符,其中"015"是八进制字符串,它表示了ascii码表中编码为十进制13的字符,也就是回车。转义字符"x1f"是"xdd"形式的转义字符,其中"1f"是十六进制字符串,它表示了ascii码表中编码为十进制31的字符,也就是▼。
可见,用转义字符方法可以表示任何可显示或不可显示的字符。在实际应用中,转义字符的使用很多,例如:例3-2中有以下程序行:
printf("a=%f,b=%f ",a,b);
其中的" "就是转义字符换行。几乎每个程序中都会有一个或若干个这样的程序行。要注意其使用。
字符型变量用于存放字符常量,即一个字符型变量可存放一个字符,所以一个字符型变量占用1个字节的内存容量。说明字符型变量的关键字是char,使用时只需在说明语句中指明字符型数据类型和相应的变量名即可。例如:
char s1, s2; /* 说明 s1,s2 为字符型变量 */
s1='a'; /* 为s1赋字符常量'a' */
s2='a'; /*为s2赋字符常量'a' */
字符串常量是用一对双引号括起来的字符序列。这里的双引号仅起到字符串常量的边界符的作用,它并不是字符串常量的一部分。例如下面的字符串都是合法的字符串常量:
"i am a student. ","abc"," ","a"
注意不要把字符串常量和字符常量混淆,如"a"和'a'是根本不同的数据,前者是字符串常量,后者是字符常量。如果字符串常数中出现双引号,则要用反斜线'"'将其转义,取消原有边界符的功能,使之仅作为双引号字符起作用。例如,要输出字符串:
he says:"how do you do."
应写成如下形式:
printf ("he says:"how do you do."");
c语言对字符串常量的长度不加限制,编译程序总是自动地在字符串的结尾加上一个转义字符''(即ascii码是0,所对应的字符是空),作为字符串常量的结束标志。对字符串操作时,这个结束标志是非常重要的。例如输出字符串时,遇到这个结束标志才终止输出。
可见,字符常量与字符串常量的区别有两个方面:从形式上看,字符常量是用单引号括起的单个字符,而字符串常量是用双引号括起的一串字符;从存储方式看,字符常量在内存中占一个字节,而字符串常量除了每个字符各占一个字节外,其字符串结束符''也要占一个字节。例如:字符常量'a'占一个字节,而字符串常量"a" 占2个字节,如图3-7示意图所示。
c语言没有专门的字符串变量,如果需要处理字符串,一般用字符型数组来实现。关于字符数组及其它字符数据处理问题在本书第八章作详细介绍。
例3-3:计算字符'a'与整型数据25的和。
/* l3_3.c */
main()
{ char a; /* 说明a为字符型变量 */
int b; /* 说明b为整型变量 */
a='a'; /* 为a赋字符常量'a' */
b=a+25; /* 计算65+25并赋值给字符变量b */
printf("%c,%d,%c,%d ",a,a,b,b); /* 分别以字符型和整型两种格式输出a、b */
}
程序运行的输出结果如下:
a,65,z,90
上述程序中a变量的值是'a',实际存放的是'a'的ascii码65,它可直接与十进制整型常量25相加,所得整型数据90赋值给变量b,而90是大写字符'z'的ascii码,所以可以将a、b变量分别以字符型和整型两种格式输出。可见字符型数据和整型数据是可以通用的。
c编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学c语言的人来说,经常会出一些连自己都不知道错在哪里的错误。
1.书写标识符时,忽略了大小写字母的区别。
2.忽略了变量的类型,进行了不合法的运算。
3.将字符常量与字符串常量混淆。
4.忽略了“=”与“==”的区别。
5.忘记加分号。分号是c语句中不可缺少的一部分,语句末尾必须有分号。
6.多加分号。 复合语句的花括号后不应再加分号,否则将会画蛇添足。
7.输入变量时忘记加地址运算符“&”。
8.输入数据的方式与要求不符。代码①scanf("%d%d",&a,&b);输入时,不能用逗号作两个数据间的分隔符②scanf("%d,%d",&a,&b);c规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。
9.输入字符的格式与要求不一致。在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。
10.输入输出的数据类型与所用格式说明符不一致。
11.输入数据时,企图规定精度。
语句中漏写break语句。
13.忽视了while和do-while语句在细节上的区别。
14.定义数组时误用变量。
15.在定义数组时,将定义的“元素个数”误认为是可使的最大下标值。
16.初始化数组时,未使用静态存储。
17.在不应加地址运算符&的位置加了地址运算符。
18.同时定义了形参和函数中的局部变量。
分为以下几类:
1、算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(%)、自增(++)、自减(--)共七种。
2、赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
3、逗号运算符:用于把若干表达式组合成一个表达式(,)。
4、关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、>=)、小于等于(<=)和不等于(!=)六种。
5、逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
6、条件运算符:这是一个三目运算符,用于条件求值(?:)。
7、位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
8、指针运算符:用于取内容(*)和取地址(&)二种运算。
9、求字节数运算符:用于计算数据类型所占的字节数(sizeof)。
10、特殊运算符:有括号(),下标[],成员(→,.)等几种。
另外,按参与运算的对象个数,c语言运算符可分为:单目运算符 (如 !)、双目运算符 (如+,- )和三目运算符 (如 ? : )。
(1)+(加法运算符或正值运算符,如2+5)。
(2)-(减法运算符或负值运算符,如4-2)。
(3)*(乘法运算符,如3*8)。
(4)/(除法运算符,如11/5)。
/的运算分为两种情况:
a、“除”的左右两边都为整数时,所得结果必然是整数(注意:仅取整数部分,不是四舍五入)
比如:5/2的值为2,不是2.5,1/2的值为0。
b、“除”的左右两边至少有一个是实型数据(即小数)时,所得结果为实型数据。
比如:5/2.0的值为2.5,7.0/2.0的值为3.5.
(5)%(模运算符或称求余运算符,%两侧均应为整型数据,如9%7的值为2)。
需要说明的是:当运算对象为负数时,所得结果随编译器不同而不同,在vc中,结果的符号与被除数相同,比如:13%-2值为1,而-15%2值为-1。
算术表达式是用算术运算符和括号将运算量(也称操作数)连接起来的、符合c语言语法规则的表达式。运算对象包括函数、常量和变量等。
在计算机语言中,算术表达式的求值规律与数学中的四则运算的规律类似,其运算规则和要求如下。
(1)在算术表达式中,可使用多层圆括号,但括号必须配对。运算时从内层圆括号开始,由内向外依次计算各表达式的值。
(2)在算术表达式中,对于不同优先级的运算符,可按运算符的优先级由高到低进行运算,若表达式中运算符的优先级相同,则按运算符的结合方向进行运算。
(3)如果一个运算符两侧的操作数类型不同,则先利用自动转换或强制类型转换,使两者具有相同类型,然后进行运算。
作用:使变量的值增1或减1。
如:++i,--i (在使用i之前,先使i的值加1、减1)。
i++,i-- (在使用i之后,使i的值加1、减1)。
(1)只有变量才能用自增运算符 (++)和自减运算符(--),而常量或表达式不能用,如10++或(x+y)++都是不合法的。
(2)++和--的结合方向是“自右向左“,如 -i++ ,i的左边是负号运算符,右边是自增运算符,负号运算和自增运算都是 “自右向左“结合的,相当于 -(i++)。
在循环语句中常用到自增(减)运算符,在指针中也常用到该运算符,考生要弄清楚“i++”和“++i”及“i--”和“--i”的区别,特别弄清楚表达式的值和变量的值。
在计算机中,数据都是以二进制数形式存放的,位运算就是指对存储单元中二进制位的运算。c语言提供6种位运算符。
位运算符 & |~<< >> ∧ 按优先级从高到低排列的顺序是:
位运算符中求反运算“~“优先级最高,而左移和右移相同,居于第二,接下来的顺序是按位与 “&“、按位异或 “∧“和按位或 “|“。顺序为~ << >> & ∧ | 。
例1:左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
例如:
a<<4
指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
例2:右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:
设 a=15,
a>>2
表示把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 。
标识符只能由字母、数字、下划线组成;
标识符的第一个字母必须是字母和下划线;
标识符区分大小写字母,如if和if是两个完全不同的标识符。
a6, b_3 , _mn
非法的标识符如下:
ab#12 , 8m , tr3:4 , yes no
标识符不能与程序中具有特殊意义的关键字相同,不能与用户编制的函数名、c语言库函数相同,在程序中各种标识符尽量不要重复,以便区分。选择变量名和其他标识符时,应注意做到 “见名知义”。
标识符分为如下三类:
关键字是具有特定含义的,专门用来说明c语言特定成分的一类标识符,不能用作用户的标识符。
auto
break
case
char
union
do
double
else
enum
extern
goto
if
int
long
short
signed
static
sizof
struct
switch
unsigned
void
for
while
typedef
continue
float
return
typedef
default
预定义标识符在c语言中也有特定的含义,但可以用作用户标识符,预定义标识符分为两类:
(1)、库函数名字,比如(printf,scanf,sin,isdigit等)
(2)、编译处理命令名,比如(define,include)
用户根据需要自己定义的标识符称为用户标识符。无论如何自定义标识符,都必须符合标识符的三条命名规则。
char *strchr(const char* _str,int _val)
char *strchr(char* _str,int _ch)
头文件:#include
功能:查找字符串s中首次出现字符c的位置
说明:返回首次出现c的位置的指针,返回的地址是被查找字符串指针开始的第一个与val相同字符的指针,如果s中不存在c则返回null。
返回值:成功则返回要查找字符第一次出现的位置,失败返回null
haystack
输入字符串。
needle
如果 needle 不是一个字符串,那么它将被转化为整型并且作为字符的序号来使用。
before_needle
若为 true,strstr() 将返回 needle 在 haystack 中的位置之前的部分。
返回: 返回字符串的一部分或者 false(如果未发现 needle)。
例子:
1
2
3
4
5
6
7
$email='name@';
$domain=strchr($email,'@');
echo$domain;//打印@
$user=strchr($email,'@',true);//从php5.3.0起
echo$user;//打印name
?>
实现:
1
2
3
4
5
6
7
8
char*strchr(char*s,charc)
{
while(*s!=''&&*s!=c)
{
++s;
}
return*s==c?s:null;
}
范例
举例1:(在visual c++ 6.0中运行通过)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include
#include
int main(void)
{
char string[17];
char *ptr,c='r';
strcpy(string,"thisisastring");
ptr=strchr(string,c);
if(ptr)
printf("thecharacter%cisatposition:%s ",c,ptr);
else
printf("thecharacterwasnotfound ");
return0;
}
运行结果:
the character r is at position: ring
请按任意键继续. . .
举例2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// strchr.c
#include
#include
int main()
{
char temp[32];
memset(temp,0,sizeof(temp));
strcpy(temp,"golden global view");
char *s = temp;
char *p,c='v';
p=strchr(s,c);
if(p)
printf("%s",p);
else
printf("not found!"); return 0;
}
运行结果:not found!press any key to continue
举例3:
1
2
3
4
5
6
7
8
9
10
11
#include
#include
void main()
{
char answer[100],*p;
printf("type something: ");
fgets(answer,sizeof answer,stdin);
if((p = strchr(answer,' ')) != null)
*p = '';//手动将 位置处的值变为0
printf("you typed "%s" ",answer);
}
fgets不会像gets那样自动地去掉结尾的 ,所以程序中手动将 位置处的值变为,代表输入的结束。
指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。
新的大小可大可小(但是要注意,如果新的大小小于原内存大小,可能会导致数据丢失,慎用!)
#include
2025年c语言符号类型实用
文件夹