第75节 字符串/字符数组/字符指针

一.字符串和字符串结束标志

1.用双撇号括起来的部分就是字符串常量

如:“abc”,“Hello!”,“a+b”,“He Lijian”

2.字符串常量"abc"在内存中占4个字节,而不是3字节

abc\0
9798990

字符’\0’为"字符串结束标志"

'\0’的ASCII值为0

二.字符数组和字符串

1.从存储机制上,字符串是以’/0’为结束标志的字符数组.

2.用字符串常量来初始化字符数组.例如

char str[]={“I am happy”};

char str[]=“I am happy”;

Iamhappy\0

3.对比
char str1[]={‘h’,‘a’,‘p’,‘p’,‘y’};

happy

char str2[]={‘h’,‘a’,‘p’,‘p’,‘y’,’\0’};

happy\0

char str3[]={‘h’,‘a’,‘p’,‘p’,‘y’,’\0’};

happy\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!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值