文章目录
前言
本篇文章主要介绍了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;
}
运行结果:
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;
}