C语言学习(三)——多维数组&字符串数组

一、多维数组&字符串数组

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//多维数组(二维以上)

int main01()
{
	using namespace std;
	int num[2][3][4];//定义了一个三维数组,有两个二维数组,每个二维数组有3个一维数组,每个一维数组有4个元素
	//三维数组初始化
	/*int sum[2][3][4] = {
		{
			{1,2,3,1},{1,2,3,2},{1,2,3,4}
		},
		{
			{},{},{}
		}
	}*/
	//打印三维数组---用三个for循环嵌套
	
	system("pause");
	return (0);
}


//字符数组:
//定义字符数组:   char  数组名[]
//数组类型为  char []

int main02()
{
	using namespace std;
	//字符类型的数据在内存中是以ASCII码存储的!!!
	//打印字符数组
	//字符串就是字符数组中有\0字符的数组
	//因为有\0字符的字符数组,操作起来方便
	char a[5] = { 'a','b','c','d','e' };
	char b[5] = { 'a','b','c' };
	char c[5] = { 'a', 'b', 'c', 'd', '\0' };//单引号定义字符数组时,需要有\0,只有用双引号定义字符串数组时,系统会自动添加\0;
	char d[] = "world";//定义了一个字符数组,有6个元素,最后一个元素是\0
	char e[100] = "abcd";//定义了一个字符数组,有100个元素
	char f[100] = "\0";//将数组元素的第0个元素填\0,其他元素就是\0
	char g[100] = { 0 };//与上同理
	for (int i = 0; i < 5; i++)
	{
		//putchar(a[i]);
		cout << a[i] << "   ";
	}
	cout << endl;
	cout << sizeof(d) << endl;

	printf("%s\n", b);
	//################################################
	char h[128] = "abcd\0efg\0";//输出时只会输出abcd;
	cout << h << endl;
	char i[] = { 'a','b','0','c' };//输出为ab0c。。。。乱码
	char j[] = { 'a','b',0,'c' };//数字0与\0等价    ‘0’在内存中以ASCII码存储为48,
	char k[]= { 'a','b','\0','c'};//j  k 两个数组输出为ab
	//注意!!!\0后面最好不要连着数字,有可能几个数字连起来刚好是一个转义字符
	system("pause");
	return (0);
}



//scanf输入字符串
int main03()
{
	using namespace std;
	char ch = 0;
	//scanf("%c",&ch);  从键盘读取一个字符
	char num[128] = "";
	//scanf("%s",num);%s从键盘中获取一个字符串,遇到\n结束,遇到空格结束
	//缺点:遇到空格就会提前结束读取,如果存放读取字符空间不足,就会继续像狗存放,造成内存污染

	system("pause");
	return (0);
}

//gets读取字符串
int main04()
{
	using namespace std;
	char num[128] = "";
	//gets(num);//()里面的参数要的是存放读取字符串的地址
	//优点:gets()遇到\n结束,但是遇到空格不结束读取空格
	//缺点:gets也会造成内存污染
	system("pause");
	return (0);
}


//fgets()
//库函数:从键盘读取一个字符串
//格式:fgets(读取字符串地址,最大可输入的多少个数据,stdin(代表标准输入-键盘输入))
int main05()
{
	using namespace std;
	char num[128] = "";

	//fgets(num, sizeof(num), stdin);//如例子中num数组,有128个元素,
	//用fgets()函数读取字符串时,最多只能读取127个字符,因为fgets会自动在数组的最后添加一个\0;
	//fgets()函数会读取空格,会把回车键\n读取
	//fgets函数不会造成内存污染

	//因为fgets()会读取\n,所以需要消除读取的\n
	//思路是将\n替换成\0
	char buf[128] = "hello\n";//buf[5]=0;就看容易消除\n
    //需要找到最后一个字符的下标
	int i = 0;
	//求的是字符数组中有效字符的个数
	while (buf[i] != '\0')
	{
		i++;
	}
	cout << i << endl;
	buf[i - 1] = '\0';

	//strlen()函数:测字符数组的有效字符个数
	i = strlen(buf);
	buf[i - 1] = '\0';
	//与上面的while循环的作用相同
	cout << i << endl;
	system("pause");
	return (0);
}

//字符数组的输出:
//puts()函数和fputs()
int main06()
{
	using namespace std;
	char buf[1024] = "helloworld";
	puts(buf);//()里同样是数组首元素地址,有换行,
	fputs(buf, stdout);//输出到文件或者标准输出终端,stdout标准输出(屏幕),没有换行
	system("pause");
	return (0);
}

 二、字符串数组练习-猜数字游戏

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>


//1.字符追加
int main07()
{
	using namespace std;
	char str1[128] = "hello";
	char str2[128] = "12345";
	int i = 0;
	int j = 0;
	while (str1[i] != '\0')
	{
		i++;
	}
	for (j = 0; j < sizeof(str2)&& str2[j] != 0; j++, i++)
	{
		str1[i] = str2[j];
	}
	cout << str1 << endl;
	

	i = strlen(str1);//测出字符数组的字符个数
	for (j = 0; j < sizeof(str2) && str2[j]!=0; j++)
	{
		str1[i] = str2[j];//将str2中的字符,追加到str1最后一个有效字符的后面
	}
	cout << str1 << endl;
	cout << sizeof(str2) << endl;
	system("pause");
	return (0);
}



//系统产生随机数函数:
//步骤:1.设置随机数种子  2.获得随机数
//srand(10)  设置种子
//int a=rand();   获得随机数、
//设置的种子如果不变,那么生成的随机数的值也不变
//所以,可以将时间用于随机数种子,这样就可以获得一个shike在改变的随机数

int main08()
{
	using namespace std;
	int t = time(NULL);//time函数获得当前时间
	srand(t);//设置种子,只设置一次
	//或者不用t,直接设置时间为种子
	//srand(time(NULL));
	int a = rand();//rand()获得随机数,想要获得随机数,就用一次rand()赋值
	cout << a << endl;
	system("pause");
	return (0);

}


//猜数字游戏:
//让系统随即产生一个四位数字,让用户输入一个四位数字,
//用户确定输入后,提示用户输入的数字与答案数字中每一位的大小关系,知道用户输入正确的数字为止


//生成四位随机数函数(方法时:生成四个随机数,用其个位数组成一个四位随机数)
int getrand()
{
	srand(time(NULL));
	int a = rand();
	int b = rand();
	int c = rand();
	int d = rand();
	int str[4];
	int num_rand = 0;
	str[0] = a % 10;
	str[1] = b % 10;
	str[2] = c % 10;
	str[3] = d % 10;
	num_rand = str[0] * 1000 + str[1] * 100 + str[2] * 10 + str[3];
	return num_rand;

}

//比较大小函数
int compare(int a,int b)
{
	int swap;
	if (a > b)
	{
		swap = 1;
	}
	else if (a < b)
	{
		swap = 2;
	}
	else
	{
		swap = 3;
	}
	return (swap);
}









int main()
{
	using namespace std;
	int getrand();
	int num_in;
	char jutice;
	int num_rand = getrand();
	int i, swap;
	int buf[4],str[4];
	cout << "是否获取一个随机数?   Y/N" << endl;
	cin >> jutice;
	

	cin >> num_in;//从键盘中输入一个四位数字
	buf[3] = num_rand % 10;
	buf[2] = num_rand / 10 % 10;
	buf[1] = num_rand / 100 % 10;
	buf[0] = num_rand /1000;

	str[3] = num_in % 10;
	str[2] = num_in / 10 % 10;
	str[1] = num_in / 100 % 10;
	str[0] = num_in / 1000;
	while (num_in == num_rand)
	{
		
		
		
		
		
		cout << "请重新输入" << endl;
		cin >> num_in;
	}
	cout << "您猜对了!!" << endl;

	system("pause");
	return (0);
}

 三、升级版猜数字游戏

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	using namespace std;
	int getrand();
	int num_in;					//用户输入的四位数
	char jutice;				//判断是否生成随机数Y/N
	int num_rand;	//四位随机数
	int i, swap=0;
	int flag_1 = 0;
	int flag_2 = 0;
	int buf[4], str[4];			//用于存放随机数和用户输入数的千位,百位,十位,个位
	while (swap == 0)
	{
		cout << "是否获取一个随机数?   Y/N" << endl;
		while (flag_1 == 0)
		{
			cin >> jutice;
			if (jutice == 'Y')
			{

				cout << "为您生成随机数" << endl;
				num_rand = getrand();
				cout << "请输入您猜的数:" << endl;
				cin >> num_in;
				//flag_1 = 1;
				break;
				
			}


			else if (jutice == 'N')
			{
				cout << "结束游戏" << endl;
				//flag_1 = 1;
				swap = 1;
				break;

			}
			else
			{
				cout << "您输入有误,请重新输入:" << endl;
			}
			
		}

		while (num_in != num_rand)
		{
			//求随机数的四个位
			buf[3] = num_rand % 10;
			buf[2] = num_rand / 10 % 10;
			buf[1] = num_rand / 100 % 10;
			buf[0] = num_rand / 1000;

			//求输入数的四个位
			str[3] = num_in % 10;
			str[2] = num_in / 10 % 10;
			str[1] = num_in / 100 % 10;
			str[0] = num_in / 1000;

			cout << endl;

			//判断千位数字是否正确
			if (buf[0] > str[0])
			{
				cout << "千位数字:比正确数字小" << endl;
			}
			else if (buf[0] < str[0])
			{
				cout << "千位数字:比正确数字大" << endl;
			}
			else
			{
				cout << "千位数字:正确" << endl;
			}

			//判断百位数字是否正确
			if (buf[1] > str[1])
			{
				cout << "百位数字:比正确数字小" << endl;
			}
			else if (buf[1] < str[1])
			{
				cout << "百位数字:比正确数字大" << endl;
			}
			else
			{
				cout << "百位数字:正确" << endl;
			}

			//判断十位数字是否正确
			if (buf[2] > str[2])
			{
				cout << "十位数字:比正确数字小" << endl;
			}
			else if (buf[2] < str[2])
			{
				cout << "十位数字:比正确数字大" << endl;
			}
			else
			{
				cout << "十位数字:正确" << endl;
			}

			//判断个位数字是否正确
			if (buf[3] > str[3])
			{
				cout << "个位数字:比正确数字小" << endl;
			}
			else if (buf[3] < str[3])
			{
				cout << "个位数字:比正确数字大" << endl;
			}
			else
			{
				cout << "个位数字:正确" << endl;
			}
			
			if (num_in != num_rand)
			{
				cin >> num_in;
			}
		}
		cout << "恭喜你!猜对了!" << endl;
		//判断用户是否还要继续游戏
		cout << "还要继续游戏吗?  Y/N" << endl;
		while (flag_2 == 0)
		{

			cin >> jutice;
			if (jutice == 'Y')
			{
				swap = 0;
				//flag_2 = 1;
				break;
			}
			else if (jutice == 'N')
			{
				swap = 1;
				//flag_2 = 1;
				break;
			}
			else
			{
				cout << "您输入有误,请重新输入:" << endl;

			}
		}

		

	}
	cout << "游戏结束,感谢您的支持!" << endl;
	

	system("pause");
	return (0);
}


//获得四位随机数
int getrand()
{
	//生成四个随机数,分别取四个随机数的个位数,组合成一个四位随机数,并返回
	srand(time(NULL));
	int a = rand();
	int b = rand();
	int c = rand();
	int d = rand();
	int str[4];
	int num_rand = 0;
	str[0] = a % 10;
	str[1] = b % 10;
	str[2] = c % 10;
	str[3] = d % 10;
	num_rand = str[0] * 1000 + str[1] * 100 + str[2] * 10 + str[3];
	return num_rand;

}

    原文作者:不加黄花菜
    原文地址: https://blog.csdn.net/weixin_41485784/article/details/124504149
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞