首页 > 编程语言 >【C/C++】通过下面的工作来改进String类声明(即将String1.h升级为String2.h)。 a. 对+运算符进行重载,使之可将两个字符串合并成一个。 b. 提供一个Stringlow()

【C/C++】通过下面的工作来改进String类声明(即将String1.h升级为String2.h)。 a. 对+运算符进行重载,使之可将两个字符串合并成一个。 b. 提供一个Stringlow()

时间:2023-12-31 18:55:49浏览次数:35  
标签:字符 const String int object operator str 字符串

通过下面的工作来改进String类声明(即将String1.h升级为String2.h)。

a. 对+运算符进行重载,使之可将两个字符串合并成一个。

b. 提供一个Stringlow()成员函数,将字符串中所有的字母字符转换为小写(别忘了cctype系列字符函数)。

c. 提供String()成员函数,将字符串中所有字母字符转换成大写。

d. 提供一个这样的成员函数,它接受一个char参数,返回该字符在字符串中出现的次数。

使用下面的程序来测试您的工作:

// pe12_2.cpp
#include <iostream>
using namespace std;
#include "string2.h"
int main()
{
    String s1(" and I am a C++ student.");
    String s2 = "Please enter your name: ";
    String s3;
    cout << s2; // overloaded << operator
    cin >> s3; // overloaded >> operator
    s2 = "My name is " + s3; // overloaded =, + operators
    cout << s2 << ".\n";
    s2 = s2 + s1;
    s2.stringup(); // converts string to uppercase
    cout << "The string\n" << s2 << "\ncontains " << s2.has('A')
        << " 'A' characters in it.\n";
    s1 = "red"; // String(const char *),
    // then String & operator=(const String&)
    String rgb[3] = { String(s1), String("green"), String("blue")};
    cout << "Enter the name of a primary color for mixing light: ";
    String ans;
    bool success = false;
    while (cin >> ans)
    {
        ans.stringlow(); // converts string to lowercase
        for (int i = 0; i < 3; i++)
        {
            if (ans == rgb[i]) // overloaded == operator
            {
                cout << "That's right!\n";
                success = true;
                break;
            }
        }
        if (success)
            break;
        else
            cout << "Try again!\n";
    }
    cout << "Bye\n";
    return 0;
}

输出应与下面相似:

Please enter your name: Fretta Farbo
My name is Fretta Farbo.
The string
MY NAME IS FRETTA FARBO AND I AM A C++ STUDENT.
contains 6 'A' characters in it.
Enter the name of a primary color for mixing light: yellow
Try again!
BLUE
That's right!
Bye

这道题是C++ Primer Plus习题及答案-第十二章的第二题,以下为自己写的答案,仅以此作为记录,若有不足欢迎指出:

string2.h:

#pragma once
#include <iostream>
#include <cctype>
#include <string>
#include <fstream>
#include <istream>
using namespace std;
class String {
public:
  String();
  String(const char* str);
  String(string& str);
  void stringup();
  void stringlow();
  int has(const char str)const;
  String operator+(String& object);
private:
  string str;
  int len = 0;
private:
  friend ostream& operator<<(ostream& os, String& object);
  friend istream& operator>>(istream& is, String& object);
  friend String operator+(const char* str1, String& object);
  friend bool operator==(const String& object1, const String& object2);
};

string2.cpp:

#include "String.h"

String::String() {
  str = "未知";
  len = str.length();
}

String::String(const char* str) {
  this->str = str;
  len = strlen(str);
}

String::String(string& str) {
  this->str = str;
  len = str.length();
}

void String::stringup() {
  for (int i = 0; i < len; i++) {
    str[i] = toupper(str[i]);
  }
}

void String::stringlow() {
  for (int i = 0; i < len; i++) {
    str[i] = tolower(str[i]);
  }
}

int String::has(char str) const {
  int count = 0;
  for (int i = 0; i < len; i++) {
    if (this->str[i] == str) {
      count++;
    }
  }
  return count;
}

String String::operator+(String& object) {
  str = str.append(object.str);
  return String(str);
}

ostream& operator<<(ostream& os, String& object) {
  os << object.str;
  return os;
}

istream& operator>>(istream& is, String& object) {
  getline(is, object.str);//可以包括空格的输入
  //is >> object.str;
  return is;
}

String operator+(const char* str1, String& object) {
  string tmp = string(str1) + object.str;

  return String(tmp);
}

bool operator==(const String& object1, const String& object2) {
  if (object1.str == object2.str && object1.str.length() == object2.str.length()) {
    return true;
  }
  return false;
}

main.cpp:

#include <iostream>
#include "String2.h"
using namespace std;
int main() {
  String s1(" and I am a C++ student.");
  String s2 = "Please enter your name:";
  String s3;
  cout << s2;
  cin >> s3;
  s2 = "My name is " + s3;
  cout << s2 << ".\n";
  s2 = s2 + s1;
  s2.stringup();
  cout << "The string\n" << s2 << "\n contanins " << s2.has('A') << " 'A' characters in it.\n";
  s1 = "red";
  String rgb[3] = { String(s1),String("green"),String("blue") };
  cout << "Enter the name of a primary color for mixing light:";
  String ans;
  bool success = false;
  //cin.get();
  while (cin >> ans) {
    ans.stringlow();
    for (int i = 0; i < 3; i++) {
      if (ans == rgb[i]) {
        cout << "That's right!\n";
        success = true;
        break;
      }
    }
    if (success) {
      break;
    }
    else {
      cout << "Try again!\n";
    }
  }
  cout << "Bye\n";
  return 0;
}

运行结果:

标签:字符,const,String,int,object,operator,str,字符串
From: https://www.cnblogs.com/smartlearn/p/17937868

相关文章

  • MATLAB 的字符串分析
    MATLAB的字符串分析。字符串实际上是指1Xn的字符数组。MATLAB软件具有强大的字符串处理功能,提供了很多的字符或字符串处理函数,包括字符串的创建、字符串的属性、比较、查找以及字符串的转换和执行等。由于MATLAB语言是用C语言进行开发的,因此它的字符串操作与C语言的相应操作非......
  • string
    pg有3种字符串类型。char(n):定长,不足用空格填补。省略n表示char(1)。varchar(n):变长,省略n表示任意长度,无限制。n是字符个数,不是字节个数。thelengthnmustbegreaterthanzeroandcannotexceed10,485,760.写入表字段的字符串长度超出n数据库会报错。text:不需要也无......
  • 无涯教程-Java 正则 - String replaceAll(String replacement)函数
    java.util.regex.Matcher.replaceAll(Stringreplacement)方法使用给定的替换字符串替换与该模式匹配的每个子序列。StringreplaceAll-声明publicStringreplaceAll(Stringreplacement)replacement  - 替换字符串。StringreplaceAll-返回值通过用替换字符串替......
  • 无涯教程-Java 正则 - Matcher static String quoteReplacement(String s)函数
    java.time.Matcher.quoteReplacement(Strings)方法返回指定字符串的文字替换字符串。staticStringquoteReplacement-声明publicstaticStringquoteReplacement(Strings)s  - 要被字符串化的字符串。staticStringquoteReplacement-返回值文字字符串替换。......
  • 大数据分析与可视化 之 实验08 Pandas字符串和文本处理
    实验08Pandas字符串和文本处理实验学时:2学时实验类型:验证实验要求:必修一、实验目的学会正确使用常见的字符串函数如:len()、find()、strip()、replace()、contains()函数。解决实际数据中的字符串和文本处理问题。二、实验要求使用常见的字符串函数(如:len()、find()、s......
  • Java基础 (关键字-字符)
    标识符Java所有的组成部分都需要名字、类名、变量名以及方法名都被称为标识符关键字abstractassertbooleanbreakbytecasecatchcharclassconstcontinuedefaultdodoubleelseenumextendsfinalfinallyfloatforgotoifimplementsimportinsta......
  • 无涯教程-Java 正则 - Matcher String group(String name)函数
    java.time.Matcher.group(Stringname)方法返回在上一次匹配操作期间给定组捕获的输入子序列。Stringgroup(Stringname)-声明以下是java.time.Matcher.group(Stringname)方法的声明。publicStringgroup(intgroup)group - 该匹配器模式中捕获组的索引。String......
  • 无涯教程-Java 正则 - Matcher String group函数
    java.time.Matcher.group()方法尝试查找与模式匹配的输入序列的下一个子序列。Stringgroup()-声明以下是java.time.Matcher.group()方法的声明。publicStringgroup()Stringgroup()-返回值与上一个匹配项匹配的(可能为空)子序列,为字符串形式。IllegalStateExcep......
  • 关于vue里面使用markdown插入视频前台渲染导致<video>等标签被转义成字符,导致视频加载
    markdown中插入视频前台渲染出来导致<video>等标签被转义成字符解决办法:如图:在markdown里面插入视频,可以按照下面写法,哈哈,虽然很捞,但是还是可以满足的。<videosrc="https://xxxxxxxxxxxxxx.mp4"controls="true"style="max-width:100%;height:auto;"></video> ......
  • ES6之模板字符串
    <script>//类型也是字符串类型letstr=`这是一个模板字符串`;//可以换行(普通字符串换行需要使用引号和加号拼接)letstr2=`<ul><li></li><li></li><li></li>......