一.字符串和字符串结束标志
1.用双撇号括起来的部分就是字符串常量
如:“abc”,“Hello!”,“a+b”,“He Lijian”
2.字符串常量"abc"在内存中占4个字节,而不是3字节
a | b | c | \0 |
---|---|---|---|
97 | 98 | 99 | 0 |
字符’\0’为"字符串结束标志"
'\0’的ASCII值为0
二.字符数组和字符串
1.从存储机制上,字符串是以’/0’为结束标志的字符数组.
2.用字符串常量来初始化字符数组.例如
char str[]={“I am happy”};
char str[]=“I am happy”;
I | a | m | h | a | p | p | y | \0 |
---|
3.对比
char str1[]={‘h’,‘a’,‘p’,‘p’,‘y’};
h | a | p | p | y |
---|
char str2[]={‘h’,‘a’,‘p’,‘p’,‘y’,’\0’};
h | a | p | p | y | \0 |
---|
char str3[]={‘h’,‘a’,‘p’,‘p’,‘y’,’\0’};
h | a | p | p | y | \0 | … | … | … | … |
---|
在程序中依据’\0’的位置判定字符串是否结束,而不是根据数组的长度来决定字符串长度
4.字符数组不可整体赋值
char str[12];
str=“The String”; // 错误!不能为数组名赋值字符串
//数组名实为指针,代表地址!
三.字符串的输出和输入
1.字符串的4种输出方式
第1种:知道字符串长度,利用循环逐个输出
#include <stdio.h>
int main()
{
char str[] = "I am happy";
for (int i = 0; i < 10; ++i)
{
printf("%c", str[i]);
}
}
运行结果:
I am happy
第2种:判断'\0'的位置,利用循环逐个输出
#include <stdio.h>
int main()
{
char str[] = "I am happy";
int i = 0;
while (str[i] != '\0')
printf("%c", str[i++]);
}
运行结果:
I am happy
第3种:利用puts()函数输出字符串
#include <stdio.h>
int main()
{
char str[] = "I am happy";
puts(str);
}
运行结果:
I am happy
//自动换行
第4种:利用pritnf()函数输出字符串
#include <stdio.h>
int main()
{
char str[] = "I am happy";
printf("%s", str);
}
运行结果:
I am happy
2.字符串的3种输入方式
第1种:利用scanf函数及循环逐个字符输入
#include <stdio.h>
int main()
{
char str[20];
for (int i = 0; i < 20; i++)
scanf_s("%c", &str[i],20);
}
第2种:直接scanf函数%s字符串格式直接输入
#include <stdio.h>
int main()
{
char str[20];
scanf_s("%s", str,20);
}
备注:
scanf_s()遇空格、\t、回车结束;
scanf_s()只能输入单个单词;
scanf_s()不存在越界风险;
第3种:利用gets()函数直接输入
#include <stdio.h>
int main()
{
char str[20];
gets(str);
printf("%s", str);
}
备注:
gets()遇空格、\t不结束,遇回车才结束;
gets()可输入整个句子;
gets()输入字符不能超过数组长度,否则越界异常;
四.用指向字符的指针引用字符串
#include <stdio.h>
int main()
{
char str[] = "I am happy";
char* s = str;
puts(str);
puts(s);
return 0;
}
运行结果:
I am happy
I am happy
五.杜绝指向字符的野指针
1.无异常的程序
#include <stdio.h>
int main()
{
char str[80];
char* s = str;
gets(s); //给字符数组赋值;
puts(s);
return 0;
}
运行结果:
12312ksdffk
12312ksdffk
2.无异常的程序
#include <stdio.h>
int main()
{
char* s = "I am happy";
puts(s);
return 0;
}
运行结果:
I am happy
3.异常的程序
#include <stdio.h>
int main()
{
char* s; /指针没有初始化,指向位置不明确,野指针;
gets(s);
puts(s);
return 0;
}
六.对字符串中字符的存取方法
#include <stdio.h>
int main()
{
char str1[] = "I am a boy!", str2[20], str3[20], * p1, * p2;
int i;
for (p1 = str1, p2 = str2; *p1 != '\0'; p1++, p2++) //将str1中内容复制到str2中
*p2 = *p1;
*p2 = '\0'; //为str2添加字符结束标识
//以上只是练习字符串数组的复制功能,与下面程序无关
for (p1 = str1, i = 0; *p1 != '\0'; p1++, i++)
{
if (*p1 >= 97 && *p1 <= 122) //将小写转换为大写
str3[i] = *p1 - 32;
else
str3[i] = *p1;
}
str3[i] = '\0'; //添加字符串结束标志,否则输出乱码
puts(str3); //输出字符串数组
puts(str1);
printf("%s", str3); //输出字符串数组
}
运行结果:
I AM A BOY!
I am a boy!
I AM A BOY!