目录
字符数组
字符数组是元素的数据类型为字符类型的数组
charc[10];
charch[3][4];
字符数组初始化
逐个字符赋值,没有赋值的直接给与\0
#include <stdio.h>
int main() {
//char ch[5] = {'H', 'e', 'l', 'l', 'o'};
//char ch[5] = {'H', 'e', 'l'};
char ch[5] = {'H', 'e', 'l', '\0', '\0'};
int i;
for (i = 0; i < sizeof(ch) / sizeof(char); i++) {
printf("%d %c\n", ch[i], ch[i]);
}
return 0;
}
调试可以看到内存分配的未赋值都是'\0'
字符串
C语言中无字符串变量,一般用字符数组处理字符串
字符串结束标志:‘\0’
用字符串常量初始化
#include <stdio.h>
int main() {
//char ch[6] = {"hello"};
//char ch[6] = "hello";
char ch[] = "hello";
int i;
for (i = 0; i < 6; i++) {
printf("%d - %c\n", ch[i], ch[i]);
}
printf("sizeof(ch)=%ld\n", sizeof(ch));
return 0;
}
字符串结尾是'\0',内存分配的未赋值也是'\0'
假如字符数组的空间和字符串长度一致,也就是少了'0'
#include <stdio.h>
int main() {
//char ch[6] = {"hello"};
//char ch[6] = "hello";
char ch[5] = "hello";//无法分配'\0'
int i;
for (i = 0; i < 6; i++) {
printf("%d - %c\n", ch[i], ch[i]);
}
printf("%s\n", ch);
return 0;
}
会一直找到有'\0'的地方,输出结果不正常
用%s打印字符串
#include <stdio.h>
int main() {
char ch[] = "hello";
char ch2[5] = { 'h', 'e', 'l', 'l', 'o' };
printf("ch:%s %p\n", ch, &ch[0]);
printf("ch2:%s %p\n", ch2, &ch2[0]);
return 0;
}
可以看到字符数组ch2一直往后面找'\0'
练习
从键盘输入字符串并输出-scanf
#include <stdio.h>
int main() {
char ch[50];
//scanf("%s", ch);
scanf("%[^\n]", ch);/*
如果要使用scanf输入字符串,并且字符串中可能包含
空格,则需要转义字符%[^\n],这样可以输入以换行符为结尾的字符串,
而不管它中间是否包含空格*/
printf("%s\n", ch);
return 0;
}
字符串输入函数-gets
char*gets(char*s)
从键盘输入一以回车结束的字符串放入字符数组,并自动加‘\0’
gets()函数比scanf简洁,输入的字符串中有空格也可以输入
输入串长度要注意,保证数组内存空间够用‐gets函数不建议使用,建议使用fgets
#include <stdio.h>
int main() {
char ch[10];
gets(ch);
//scanf("%s", ch);
printf("%s\n", ch);
return 0;
}
超过数组内存空间报错
字符串输出函数-puts
intputs(constchar*s)
功能:向显示器输出字符串,并追加换行符
说明:字符数组必须以‘\0’结束
#include <stdio.h>
int main() {
char ch[10] = {" a b c"};
puts(ch);
printf("ch:%s", ch);
return 0;
}