字符
最小的整数类型:char char是一种整数,也是一种特殊的类型:字符。 printf,scanf里用%c来输入输出字符。
#include<stdio.h>
int main() {
char c=1;
char d='1';
if(c==d){
printf("相等\n");
}else{
printf("不相等\n");
}
printf("c=%d\n",c);
printf("d=%d\n",d);
}
 这说明:
- 数字1和字符 ‘1’ 是不一样的。
- 字符 ‘1’ 在计算机内部的值就是49。
- 'A’是65。'a’是97 ,0是48
#include<stdio.h>
int main() {
char c;
scanf("%c",&c);
printf("c=%d\n",c);
printf("c=%c\n",c);
}

#include<stdio.h>
int main() {
char c=65;
printf("c=%d\n",c);
printf("c=%c\n",c); ASCII值65所对应的字符
}
int main() {
char c='A';
printf("c=%d\n",c);
printf("c=%c\n",c);
}
 空格的ASCII是32
#include<stdio.h>
int main() {
int i;
char c;
scanf("%d%c",&i,&c);
printf("i=%d,c=%d,c='%c'\n",i,c,c);
}
 scanf读取了12以及后面的空格,并未读取到1.  这个时候读到了A。也就是说在scanf()里面%d后没有空格的时候注意输入的格式。(注意 “%d%c” 和 “%d %c” 之间的区别)
字符计算 常见ASCII码的大小规则为: 数字(0 ~ 9)<大写字母(A ~ Z)<小写字母(a ~ z). 同个字母的大写字母比小写字母小32. printf() 支持的格式
int main() {
printf("请分别输入身高的英尺和英寸,\n年后" "如输入5 7表示5英尺7英寸:");
}
 逃逸字符
int main() {
printf("请分别输入身高的英尺和英寸,如输入\"5 7\"表示5英尺7英寸:");
}

字符串
字符数组(不能用字符串的方式做运算):
char word[]={'H','e','l','l','o','!'};
字符串:
char word[]={'H','e','l','l','o','!','\0'};
对于C语言来说,字符串是以\0结尾的一串字符。\0是标志字符串的结束,但它不是字符串的一部分。该字符的存在意味着数组的单元数(字节数,字符数)必须至少比要存储的字符数多1. 例如 char word[8]最多只能接收7个字符,因为要留一个空位给\0.
计算字符串长度(strlen)的时候不包含这个0. 计算字符串占据内存空间(sizeof)的时候包含这个0.
字符串在内存里的存在形式就是数组,C没有为字符串定义专门的变量类型,而是把它存储在char数组中。但访问形式可以是数组或指针。 字符串处理函数放在 string.h 这个头文件里
定义一个变量去表达字符串: 有几种不同的写法,(字符串是数组,所以实际上这些变量都是字符数组的变量,只不过有不同的表现形式)
char *str="hello";
char word[]="hello";
char line[10]="hello";
“hello”会被编译器变成一个字符数组,这个数组的长度(sizeof)是6 (眼睛所看到的字符的长度+1),结尾还有表示结束的0. 没有这个0,它不是字符串。 两个相邻的字符串常量,中间没有任何其他符号,会被自动连接起来。如:
printf("abcde" "fghijkl");
输出结果:
abcdefghijkl
printf("abcdef\
jvkdsgjsdgj");
s是一个指针,指向一个字符串常量,不能对s所指的字符串进行读写修改。
char *s="Hello,world!";
如果需要修改字符串,应该用数组:
char s[]="Hello,world!";
字符串两种形式(指针\数组):
char *str="Hello world!";
char word[]="Hello world!";
作为数组,表示这个字符串就在这儿,作为本地变量,空间会被自动回收。 作为指针,不知道这个字符串在哪里,只读的,不可写(可用作函数参数,动态分配空间) 因此: 如果是构造一个字符串,用数组形式。 如果是处理一个字符串,用指针形式。 字符串输入输出:
char *t="title";
char *s;
s=t;
其实做的事情是指针t指向了某处的一个字符串,内容是 title\0 。然后s也指向了t所指的这个字符串。 并没有产生新的字符串,对s的任何操作就是对t做的。 scanf,printf对字符串进行输入输出 %s
char string[8];
scanf("%s",string);
printf("%s",string);
scanf读入一个单词(到空格,tab或回车为止,分隔符,不会被读到) 例如: 只有一个scanf时,
scanf("%s",string);
这时输入
hello world
只会读到hello
当再有一个scanf时,
scanf("%s",string);
scanf("%s",string2);
string会是hello,string2会是world,空格是不会被读到的,因为是分隔符。
scanf("%7s",string);
例如输入12345678,只会读取1234567
常见错误:
char *string;
scanf("%s",string);
char *不是字符串类型 第一行只是定义了一个指针变量,string是一个将来要去指向某个字符串的指针。但是并没有被初始化,本地变量没有默认初始值,原来在那个内存里有什么就是什么,所指的地方是有害的地方的时候,程序就会崩溃。 所以要对指针进行初始化,要让指针指向一个实际有效的地址。
|