week02-项目3-输入的优化

文章目录


前言

本篇文章主要介绍了C/C++的字符串和数组的概念


1.字符串存储变量

1.1 项目需求

在项目2的基础上用字符串存储用户名和密码

1.2 项目实现

login2.cpp
#include <iostream>
#include <Windows.h>
#include <string>//string 文件在std命名空间下,C++的标准库为string,C的为string.h

using namespace std;

int main(void) {
	string loginName;
	string pwd;

	cout << "请输入账号:";
	cin >> loginName;
	cout << "请输入密码:";
	cin >> pwd;

	system("pause");
	cout << "您的账号是" << loginName << endl;
	cout << "您的密码是:" << pwd << endl;

	system("pause");
	return 0;
}


运行结果:
week02-项目3-输入的优化

1.3 知识锦囊:字符串的概念

1.3.1 基本概念

  字符串就是0个或多个“字符”组成的“有序”序列。

1.3.2 字符串常量

“字面型”字符串常量,要求用""扩起来。
printf(“name=%s”, “heihei”); //C语言方式输出字符串,%s用来匹配字符串
cout << “heihei”; //C++方式输出字符串

1.3.3 字符串变量的表示

在C语言中,使用char类型的数组,来存储字符串变量
注:C语言中,没有专用的字符串类型。
在C++中,使用std::string类型来表示字符串变量。

1.3.4 字符串结束符

在c语言中,为了便于存储字符串,要求在最后一个字符的后面存储一个0(一个字节)。
这个0, 称为“字符串结束符”,常用 ‘\0’ 表示。
在C++语言中,字符串的最后并没有字符串结束符!
实际存储时,根据编译器的不同,最后可能存储一个字符串结束符,也可能没有。


2.C++风格的字符串

2.1 string变量的定义和初始化

  

#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;

int main(void) {
	//1.定义与赋值 c++风格
	string girlFriend1;
	girlFriend1 = "王菲";
	string girlFriend2;
	girlFriend2 = girlFriend1;
	//2.初始化
	string girlFriend3("周迅");
	string girlFriend4(girlFriend3);
	string girlFriend5(10,'a');//等价与 string girlFriend5("aaaaaaaaaa");

	string girlFriend6;//没有赋值就是空串
	cout << "girlFriend1=" << girlFriend1 << endl;
	cout << "girlFriend2=" << girlFriend2 << endl;
	cout << "girlFriend3=" << girlFriend3 << endl;
	cout << "girlFriend4=" << girlFriend4 << endl;
	cout << "girlFriend5=" << girlFriend5 << endl;
	cout << "girlFriend6=" << girlFriend6 << endl;
	


	//c语言风格
	char a[20] = "hello world";
	char b[20] = { 'h','e','l','l','o',' ','w','o','r','l','d','\0' };
	char c[] = "hello world";
	char d[] = { 'h','e','l','l','o',' ','w','o','r','l','d', 0 };
	printf("a = %s\n", a);
	printf("b = %s\n", b);
	printf("c = %s\n", c);
	printf("d = %s\n", d);

	//字符串与字符数组的区别:字符串一定是一个char的数组,但char的数组未必是字符串;
	//数字0(和字符‘\0’等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char的数组。
	//字符串定义,要么指定字符长度,要么以0或'\0'结尾。
	
	//错误示范:会出现乱码
	char buf[] = { 'a', 'b', 'c' };
	printf("buf = %s\n", buf);

	

	system("pause");
	return 0;
}

2.2 string变量的输入输出

#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;

int main0302(void) {	
	//demo1 - 字符串的输入从第一个非空白字开始,直到遇到空白字符时停止输入
	//空白字符是指:空格,制表符,回车符
	//string job;
	//cout << "你是做什么工作的呀?" << endl;
	//cin >> job;
	//cout << "做" << job << "收入应该很不错吧!" << endl;
	

	demo2 - 自动跳过空白字符
	//string university;
	//string profession;
	//cout << "你是读那个大学什么专业的呢?" << endl;
	//cin >> university >> profession; 
	//cout << university << "的" << profession << "专业很不错哦!" << endl;
	 
	
	demo3 - 循环输入
	//string food;
	//int count = 0;
	//cout << "你喜欢什么食物?" << endl;
	//while (cin >> food)//当用户输入 Ctrl + z 并回车 cin >> food返回0,  0就是假
	//{
	//	cout << "我喜欢吃" << food << endl;
	//	cout << "你还喜欢吃啥?" << endl;
	//	count++;
	//}
	//cout << "你喜欢的事物有" << count << "种" << endl;


	//demo4 - 输入一行 getline
	string addr;
	cout << "你想去哪?" << endl;
	getline(cin, addr);//读取一行数据写入(含空格),到‘\n’结束,同时‘\n’会被丢弃
	//empty方法
	if (addr.empty() == true) 
	{
		cout << "你竟然不知道,你这个没有梦想的咸鱼!" << endl;
		return 1;
	}
	else
	{
		cout << "正好我也要去" << addr << ",我带着你去吧" << endl;
	}
	//size()和length()完全等效
	//长度是指字符串占用的字节数,如果含有汉字,那么总的字节数和汉字个数不同 

	cout << "addr的长度是:" << addr.size() << endl;
	cout << "addr的长度是:" << addr.length() << endl;

	system("pause");
	return 0;
}

2.3 string字符串的比较

#include <iostream>
#include <Windows.h>

using namespace std;

int main0303(void) {
	/*
		字符串的比较:
			从字符串的第一个字符开始,对应字符逐个比较,直到遇到不相等的字符为止。
			比较运算符有:
			>   >=   <    <=   ==

			比较运算的结果:逻辑真,  逻辑假

			“123”  <  “1230”          真
			“19”   >   “123456789”     真
			“2”  >   “1999”           真
			“123”  ==  “123”            真
			“123”  ==  “1230”           假

			c语言的字符串,不能使用这个方式来进行字符串比较。
	*/
	string myGirl = "小芳";
	string yourGirl;
	cout << "你喜欢的女孩是?" << endl;
	cin >> yourGirl;
	if (yourGirl == myGirl)
	{
		cout << "兄弟,你好绿!" << endl;
	}
	else
	{
		cout << "祝你被绿" << endl;
	}
	system("pause");
	return 0;
}

2.4 string字符串的加法

#include <iostream>
#include <Windows.h>

using namespace std;

int main0304(void) {
	//把+左侧的字符串,和+右侧的字符串,直接拼接成一个新的字符串
	//注意顺序。(C语言的字符串不支持该方式)
	string a = "heihei";
	string b = "wakaka";
	string c;
	c = a + b;
	cout << c << endl;
	c += "yi";
	cout << c << endl;

	system("pause");
	return 0;
}


3.数组

3.1 数组的定义

  数组,就是多个元素的有序“组合”。
  int a[5]  //定义了一个数组a,包含5个元素,每个元素都是int变量

3.2数组的初始化

#include <iostream>
#include <Windows.h>
#include <stdio.h>
using namespace std;

int main0306(void) {
	
	//在定义数组的同时,设置数组内的元素值。
	int a[8] = { 20,45,20,33,55 };
	printf("%d,%d,%d,%d,%d\n", a[0], a[1], a[2], a[3], a[4]);
	cout << a[0] << "," << a[1] << "," << a[2] << "," << a[3] << "," << a[4] << endl;

	//把数组所有元素初始化为0
	int b[8] = { 0 };

	//但这样把数组第一个元素初始化为1,其它值都初始化为0
	int c[8] = { 1 };
		
	//定义数组d, 这个数组包含3个元素!
	// 根据“初始化列表”,自动计算数组的容量
	int  d[] = { 1,2,5 }; 
	//仅仅C编译器支持,C++编译器中不支持,即C++程序中不能使用。
	int exercises[7] = {
		[1] = 1, 	//a[1] = 1
		[3] = 2, 	//a[3] = 2
					//没有指定的成员,被初始化为0
	};

	system("pause");
	return 0;
}

4.C语言风格字符串

4.1 char数组字符串的定义

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <Windows.h>

using namespace std;

int main0305(void) {
	/* 
	*  字符串常量
		“字面型”字符串常量,要求用""扩起来。
		printf("name=%s", "Tree");  //C语言方式输出字符串,%s用来匹配字符串
		cout << “Tree”;   //C++方式输出字符串
	*  字符串变量的表示
		在C语言中,使用char类型的数组,来存储字符串变量
		注:C语言中,没有专用的字符串类型。
		在C++中,使用std::string类型来表示字符串变量。


	*  在c语言中,为了便于存储字符串,要求在最后一个字符的后面存储一个0(一个字节)。
	   这个0, 称为“字符串结束符”,常用 ‘\0’ 表示。
	   在C++语言中,字符串的最后并没有字符串结束符!
	   实际存储时,根据编译器的不同,最后可能存储一个字符串结束符,也可能没有。
	*
	*/
	char a[20] = "hello world";
	char b[20] = { 'h','e','l','l','o',' ','w','o','r','l','d','\0' };
	char c[] = "hello world";
	char d[] = { 'h','e','l','l','o',' ','w','o','r','l','d', 0 };
	printf("a = %s\n", a);
	printf("b = %s\n", b);
	printf("c = %s\n", c);
	printf("d = %s\n", d);

	//字符串与字符数组的区别:字符串一定是一个char的数组,但char的数组未必是字符串;
	//数字0(和字符‘\0’等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char的数组。
	//字符串定义,要么指定字符长度,要么以0或'\0'结尾。

	//错误示范:会出现乱码
	char buf[] = { 'a', 'b', 'c' };//这是一个字符数组
	printf("buf = %s\n", buf);


	char name[10];
	printf("请输入你的名字:");
	scanf("%s", name);
	printf("你的名字是:%s\n",name);

	cout << "请输入你的名字:";
	cin >> name;
	cout << "你的名字是:" << name << endl;


	system("pause");
	return 0;
}

4.2 char数组字符串的输入输出与清空输入缓冲区

#define _CRT_SECURE_NO_WARNINGS
#define NOMINMAX
#include <stdio.h>
#include <iostream>
#include <Windows.h>
using namespace std;
void clearBuff() {
	char tmp;
	while ((tmp = getchar()) != '\n');//如果不是回车就读取输入缓冲区的字符
}
int main(void)
{
	char name[16];
	char addr[64];
	printf("敢问菇凉芳名?\n");
	scanf("%s", name);
	//scanf读取到回车符结束,此时回车符仍在输入缓冲区
	
	//清空输入缓冲区
	//fflush(stdin); //c语言,vs中没有效果
	//cin.sync(); //C++,vs中没有效果
	//cin.ignore(std::numeric_limits< streamsize >::max(), '\n');//清除输入缓冲区的所有内容,直到遇到回车符为止, 各种编译器都有效
	//自定义的clearBuff()
	clearBuff();
	printf("家是哪里的呀?\n");
	gets_s(addr);//这时用gets碰到仍在缓冲区的回车符,并把回车符丢掉
	
	
	printf("请随便输入:");
	char a[10];
	gets_s(a);

	printf("name=%s,addr=%s,a=%s", name, addr,a);
	system("pause");
	return EXIT_SUCCESS;
}

清空输入缓冲区(四种方法)详解

5.练习

5.1 统计单词

  1.项目需求:允许输入多个单词,并统计单词个数,和总长度
  2.项目实现:

C++

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <Windows.h>
#include <string>
#include <stdio.h>
using namespace std;

int main(void) {
	string word;
	int count = 0;
	int legth = 0;

	cout << "请输入任意多个单词:" << endl;

	while (true)
	{
		//输入成功则返回cin对象本身,遇到文件结束符ctrl+z,返回0;vs中cin>>的返回值不能与0直接比较;
		/*
		 while(cin>>a)的调用,这里并不是cin的返回值,
		 而是>>操作重载函数istream& operator>>(istream&, T &);
		 的返回值,其中第二个参数由cin>>后续参数类型决定。
		 其返回值类型为istream&类型,大多数情况下其返回值为cin本身(非0值),只有当遇到EOF输入时,返回值为0。
		 但在vs2019的编译器中 (cin >> word)的返回值并不能直接与0比较,这里采用逻辑!
		*/
		if (!(cin >> word)) 
		{
			break;
		}
		count++;
		legth += word.length();
	}
	cout << "一共有" << count << "个单词" << endl;
	cout << "总长度为:" << legth << endl;
	
	
	system("pause");
	return 0;
}

C

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>

int main(void) {
	char word[64];
	int count = 0;
	int length = 0;

	printf("请输入任意多个单词:");
	while (1) {
		// 输入失败 返回0
		// 遇到文件结束符 (ctrl+z),返回-1(EOF)
		if (!scanf("%s", word)) {
			break;
		}
		count++;
		length += strlen(word);
	}

	printf("一共有%d个单词\n", count);
	printf("总长度:%d\n", length);

	system("pause");

	return 0;
}


5.2 统计行数

  1.项目需求:许输入多行单词,并统计行,和单词总长度

  2.项目实现:

C++

#include <iostream>
#include <string>
#include <Windows.h>

using namespace std;

int main030201(void) {
	string line;
	int lineCount = 0;
	int length = 0;

	cout << "请输入任意多行:" << endl;
	while (1) {
		// 遇到文件结束符时, 返回NULL(0)
		if (!getline(cin, line)) {
			break;
		}
		lineCount++;
		length += line.length();
	}

	cout << "一共有" << lineCount << "行" << endl;
	cout << "总长度: " << length << endl;
	cout << "line = " << line << endl;
	system("pause");

	return 0;
}

C

#define _CRT_SECURE_NO_WARNINGS
#define true 1
#include <stdio.h>
#include <stdlib.h>

int main030202(void)
{
	char line[255];
	int lineCount = 0;
	int length = 0;
	printf("请输入任意行:\n");
	while (true)
	{
		if (gets(line) == 0) // !gets(line)
		{
			break;
		}
		lineCount++;
		length += strlen(line);
	}
	printf("总行数:%d\n", lineCount);
	printf("总长度:%d\n", length);
	system("pause");
	return EXIT_SUCCESS;
}

上一篇:Quo.js实现网站触屏功能


下一篇:JQuery的Ajax跨域请求的解决方案