字符数组

 定义:

char str[10];
用char、[]和10构造了一个一维字符数组,系统为该字符数组分配10个内存单元,即10*sizeof(char),以存储10个字符型元素。


初始化:

<span style="font-size:12px;">#include <iostream>
#include <cstring>
using namespace std;
int main()
{
	char str[10];
	cin >> str;
	//abc
	cout << sizeof(char) << endl;
	cout << sizeof(str) << endl;
	cout << endl;

	char str1[10] = { 'H', 'e', 'l', 'l', 'o', ' ', 'N', 'J', 'U', '\0' };
	//该初始化方式最好在最后加一个字符串结束标志‘\0’(转义符,对应的ASCII码是0)。
	char str2[10] = "Hello NJU";
	//该初始化方式不必加'\0',因为C语言中的字符串常量最后会自动加'\0',并赋给定义的数组。

	char str3[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };
	char str4[10] = "Hello";
	//系统会为str分配10个字节的内存空间,
	//其前6个元素被初始化为'H'、'e'、'l'、'l'、'o'、'\0',没有被初始化的元素均默认为为'\0'。

	char str5[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
	char str6[] = "Hello";
	//字符数组的长度省略后,系统为str只分配6个字节的空间
	char str7[] = { 'H', 'e', 'l', 'l', 'o' };
	//系统为str只分配5个字节的内存空间,不会自动存储'\0'

	cout << str1 << endl;
	cout << sizeof(str1) << endl;
	cout << str2 << endl;
	cout << sizeof(str2) << endl;
	cout << endl;

	cout << str3 << endl;
	cout << sizeof(str3) << endl;
	cout << str4 << endl;
	cout << sizeof(str4) << endl;
	cout << endl;

	cout << str5 << endl;
	cout << sizeof(str5) << endl;
	cout << str6 << endl;
	cout << sizeof(str6) << endl;
	cout << str7 << endl;
	cout << sizeof(str7) << endl;
	return 0;
}</span>

输入/输出:

gets()/puts()

gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符。

用cin/scanf(scanf_s)的输入,遇到空白字符为止;但gets()函数将接收输入的整个字符串直到遇到换行为止。


也就是说:gets()函数读取到\n(我们输入的回车)于是停止读取,但是它不会把\n包含到字符串里面去。

然而,和它配合使用的puts函数,却在输出字符串的时候自动换行( 用cout的输出不换行)


gets_s()/fgets()

函数原型:char *fgets(char *buf, int bufsize, FILE *stream);

gets()函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序。

在2011年12月,ANSI 采纳了 ISO/IEC 9899:2011 标准,标准中删除了 gets()函数,使用一个新的更安全的函数gets_s()替代。

fgets()函数也考虑溢出的问题,但是其区别在于直接将换行回车存入不转换成'\0‘。

作为函数的参数:

当一维数组作为函数的参数时,通常需要把一维数组的名称以及数组元素的个数传给被调用函数,以便被调函数确定数组处理的终点。
对于一维字符数组,则不需要传递数组元素的个数,因为可以凭借‘\0’来确定其处理终点。

#include <cstdio>
using namespace std;
void to_upper(char str[])
{
	for (int i = 0; str[i] != '\0'; i++)
		str[i] = str[i] - 'a' + 'A';
}
int main()
{
	char str[50];
	scanf_s("%s", str, 50);
	to_upper(str);
	printf("%s", str);
	return 0;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值