【stanford C++】字符串(String)与流(Stream)
- #include <string>
可以通过调用如下方法:
- str.length()
来获取字符串中字符的长度。
- str[index]
尽管字符串不是数组,但是上述语法是一个方便的语法方式。
- str[index] = ch
- str += text
这些操作直接改变字符串本身,而不是对字符串的副本进行操作。
- if(str1 == str2)
- {
- /* string match */
- }
在一个字符串中查询其他一些字符,可以使用find,如果找不到,则返回string::npos,而不是-1。
- if(str1.find(str2) != string::npos)
- {
- /* found str2 inside str1 */
- }
通过调用substr方法从string中获取substring。
- string allButFirstChar = str.substr(1);
- string lastFiveChars = str.substr(str.length() - 5, 5);
- string s = "I like " + integerToString(137);
strlib.h的代码如下:
- /*
- * File: strlib.h
- * --------------
- * This file exports several useful string functions that are not
- * included in the C++ string library.
- */
- #ifndef _strlib_h
- #define _strlib_h
- #include <iostream>
- #include <string>
- /*
- * Function: integerToString
- * Usage: string s = integerToString(n);
- * -------------------------------------
- * Converts an integer into the corresponding string of digits.
- * For example, calling <code>integerToString(123)</code> returns
- * the string <code>"123"</code>.
- */
- std::string integerToString(int n);
- /*
- * Function: stringToInteger
- * Usage: int n = stringToInteger(str);
- * ------------------------------------
- * Converts a string of digits into an integer. If the string is not a
- * legal integer or contains extraneous characters other than whitespace,
- * <code>stringToInteger</code> calls <code>error</code> with an
- * appropriate message.
- */
- int stringToInteger(std::string str);
- /*
- * Function: realToString
- * Usage: string s = realToString(d);
- * ----------------------------------
- * Converts a floating-point number into the corresponding string form.
- * For example, calling <code>realToString(23.45)</code> returns
- * the string <code>"23.45"</code>.
- */
- std::string realToString(double d);
- /*
- * Function: stringToReal
- * Usage: double d = stringToReal(str);
- * ------------------------------------
- * Converts a string representing a real number into its corresponding
- * value. If the string is not a legal floating-point number or contains
- * extraneous characters other than whitespace, <code>stringToReal</code>
- * calls <code>error</code> with an appropriate message.
- */
- double stringToReal(std::string str);
- /*
- * Function: toUpperCase
- * Usage: string s = toUpperCase(str);
- * -----------------------------------
- * Returns a new string in which all lowercase characters have been converted
- * into their uppercase equivalents.
- */
- std::string toUpperCase(std::string str);
- /*
- * Function: toLowerCase
- * Usage: string s = toLowerCase(str);
- * -----------------------------------
- * Returns a new string in which all uppercase characters have been converted
- * into their lowercase equivalents.
- */
- std::string toLowerCase(std::string str);
- /*
- * Function: equalsIgnoreCase
- * Usage: if (equalsIgnoreCase(s1, s2)) ...
- * ----------------------------------------
- * Returns <code>true</code> if <code>s1</code> and <code>s2</code> are
- * equal discounting differences in case.
- */
- bool equalsIgnoreCase(std::string s1, std::string s2);
- /*
- * Function: startsWith
- * Usage: if (startsWith(str, prefix)) ...
- * ---------------------------------------
- * Returns <code>true</code> if the string <code>str</code> starts with
- * the specified prefix, which may be either a string or a character.
- */
- bool startsWith(std::string str, std::string prefix);
- bool startsWith(std::string str, char prefix);
- /*
- * Function: endsWith
- * Usage: if (endsWith(str, suffix)) ...
- * -------------------------------------
- * Returns <code>true</code> if the string <code>str</code> ends with
- * the specified suffix, which may be either a string or a character.
- */
- bool endsWith(std::string str, std::string suffix);
- bool endsWith(std::string str, char suffix);
- /*
- * Function: trim
- * Usage: string trimmed = trim(str);
- * ----------------------------------
- * Returns a new string after removing any whitespace characters
- * from the beginning and end of the argument.
- */
- std::string trim(std::string str);
- /* Private section */
- /**********************************************************************/
- /* Note: Everything below this point in the file is logically part */
- /* of the implementation and should not be of interest to clients. */
- /**********************************************************************/
- /*
- * Friend function: writeQuotedString
- * Usage: writeQuotedString(outfile, str, forceQuotes);
- * ----------------------------------------------------
- * Writes the string str to outfile surrounded by double quotes, converting
- * special characters to escape sequences, as necessary. If the optional
- * parameter forceQuotes is explicitly set to false, quotes are included
- * in the output only if necessary.
- */
- void writeQuotedString(std::ostream & os, const std::string & str,
- bool forceQuotes = true);
- /*
- * Friend function: readQuotedString
- * Usage: readQuotedString(infile, str);
- * -------------------------------------
- * Reads the next string from infile into the reference parameter str.
- * If the first character (other than whitespace) is either a single
- * or a double quote, this function reads characters up to the
- * matching quote, processing standard escape sequences as it goes.
- * If not, readString reads characters up to any of the characters
- * in the string STRING_DELIMITERS in the implementation file.
- */
- void readQuotedString(std::istream & is, std::string & str);
- /*
- * Friend function: stringNeedsQuoting
- * Usage: if (stringNeedsQuoting(str)) ...
- * ---------------------------------------
- * Checks whether the string needs quoting in order to be read correctly.
- */
- bool stringNeedsQuoting(const std::string & str);
- /*
- * Friend function: writeGenericValue
- * Usage: writeGenericValue(os, value, forceQuotes);
- * -------------------------------------------------
- * Writes a generic value to the output stream. If that value is a string,
- * this function uses writeQuotedString to write the value.
- */
- template <typename ValueType>
- void writeGenericValue(std::ostream & os, const ValueType & value,
- bool forceQuotes) {
- os << value;
- }
- template <>
- inline void writeGenericValue(std::ostream & os, const std::string & value,
- bool forceQuotes) {
- writeQuotedString(os, value, forceQuotes);
- }
- /*
- * Friend function: readGenericValue
- * Usage: readGenericValue(is, value);
- * -----------------------------------
- * Reads a generic value from the input stream. If that value is a string,
- * this function uses readQuotedString to read the value.
- */
- template <typename ValueType>
- void readGenericValue(std::istream & is, ValueType & value) {
- is >> value;
- }
- template <>
- inline void readGenericValue(std::istream & is, std::string & value) {
- readQuotedString(is, value);
- }
- #endif
strlib.c的代码如下:
- /*
- * File: strlib.cpp
- * ----------------
- * This file implements the strlib.h interface.
- */
- #include <cctype>
- #include <iostream>
- #include <sstream>
- #include "error.h"
- #include "strlib.h"
- using namespace std;
- /* Function prototypes */
- /*
- * Implementation notes: numeric conversion
- * ----------------------------------------
- * These functions use the <sstream> library to perform the conversion.
- */
- string integerToString(int n) {
- ostringstream stream;
- stream << n;
- return stream.str();
- }
- int stringToInteger(string str) {
- istringstream stream(str);
- int value;
- stream >> value >> ws;
- if (stream.fail() || !stream.eof()) {
- error("stringToInteger: Illegal integer format (" + str + ")");
- }
- return value;
- }
- string realToString(double d) {
- ostringstream stream;
- stream << uppercase << d;
- return stream.str();
- }
- double stringToReal(string str) {
- istringstream stream(str);
- double value;
- stream >> value >> ws;
- if (stream.fail() || !stream.eof()) {
- error("stringToReal: Illegal floating-point format (" + str + ")");
- }
- return value;
- }
- /*
- * Implementation notes: case conversion
- * -------------------------------------
- * The functions toUpperCase and toLowerCase return a new string whose
- * characters appear in the desired case. These implementations rely on
- * the fact that the characters in the string are copied when the
- * argument is passed to the function, which makes it possible to change
- * the case of the copy without affecting the original.
- */
- string toUpperCase(string str) {
- int nChars = str.length();
- for (int i = 0; i < nChars; i++) {
- str[i] = toupper(str[i]);
- }
- return str;
- }
- string toLowerCase(string str) {
- int nChars = str.length();
- for (int i = 0; i < nChars; i++) {
- str[i] = tolower(str[i]);
- }
- return str;
- }
- /*
- * Implementation notes: equalsIgnoreCase
- * --------------------------------------
- * This implementation uses a for loop to cycle through the characters in
- * each string. Converting each string to uppercase and then comparing
- * the results makes for a shorter but less efficient implementation.
- */
- bool equalsIgnoreCase(string s1, string s2) {
- if (s1.length() != s2.length()) return false;
- int nChars = s1.length();
- for (int i = 0; i < nChars; i++) {
- if (tolower(s1[i]) != tolower(s2[i])) return false;
- }
- return true;
- }
- /*
- * Implementation notes: startsWith, endsWith
- * ------------------------------------------
- * These implementations are overloaded to allow the second argument to
- * be either a string or a character.
- */
- bool startsWith(string str, string prefix) {
- if (str.length() < prefix.length()) return false;
- int nChars = prefix.length();
- for (int i = 0; i < nChars; i++) {
- if (str[i] != prefix[i]) return false;
- }
- return true;
- }
- bool startsWith(string str, char prefix) {
- return str.length() > 0 && str[0] == prefix;
- }
- bool endsWith(string str, string suffix) {
- int nChars = suffix.length();
- int start = str.length() - nChars;
- if (start < 0) return false;
- for (int i = 0; i < nChars; i++) {
- if (str[start + i] != suffix[i]) return false;
- }
- return true;
- }
- bool endsWith(string str, char suffix) {
- return str.length() > 0 && str[str.length() - 1] == suffix;
- }
- string trim(string str) {
- int finish = str.length() - 1;
- while (finish >= 0 && isspace(str[finish])) {
- finish--;
- }
- int start = 0;
- while (start <= finish && isspace(str[start])) {
- start++;
- }
- return str.substr(start, finish - start + 1);
- }
- /*
- * Implementation notes: readQuotedString and writeQuotedString
- * ------------------------------------------------------------
- * Most of the work in these functions has to do with escape sequences.
- */
- static const string STRING_DELIMITERS = ",:)}]\n";
- bool stringNeedsQuoting(const string & str) {
- int n = str.length();
- for (int i = 0; i < n; i++) {
- char ch = str[i];
- if (isspace(ch)) return false;
- if (STRING_DELIMITERS.find(ch) != string::npos) return true;
- }
- return false;
- }
- void readQuotedString(istream & is, string & str) {
- str = "";
- char ch;
- while (is.get(ch) && isspace(ch)) {
- /* Empty */
- }
- if (is.fail()) return;
- if (ch == '\'' || ch == '"') {
- char delim = ch;
- while (is.get(ch) && ch != delim) {
- if (is.fail()) error("Unterminated string");
- if (ch == '\\') {
- if (!is.get(ch)) error("Unterminated string");
- if (isdigit(ch) || ch == 'x') {
- int base = 8;
- if (ch == 'x') base = 16;
- int result = 0;
- int digit = 0;
- while (ch != delim) {
- if (isdigit(ch)) {
- digit = ch - '0';
- } else if (isalpha(ch)) {
- digit = toupper(ch) - 'A' + 10;
- } else {
- digit = base;
- }
- if (digit >= base) break;
- result = base * result + digit;
- if (!is.get(ch)) error("Unterminated string");
- }
- ch = char(result);
- is.unget();
- } else {
- switch (ch) {
- case 'a': ch = '\a'; break;
- case 'b': ch = '\b'; break;
- case 'f': ch = '\f'; break;
- case 'n': ch = '\n'; break;
- case 'r': ch = '\r'; break;
- case 't': ch = '\t'; break;
- case 'v': ch = '\v'; break;
- case '"': ch = '"'; break;
- case '\'': ch = '\''; break;
- case '\\': ch = '\\'; break;
- }
- }
- }
- str += ch;
- }
- } else {
- str += ch;
- int endTrim = 0;
- while (is.get(ch) && STRING_DELIMITERS.find(ch) == string::npos) {
- str += ch;
- if (!isspace(ch)) endTrim = str.length();
- }
- if (is) is.unget();
- str = str.substr(0, endTrim);
- }
- }
- void writeQuotedString(ostream & os, const string & str, bool forceQuotes) {
- if (!forceQuotes && stringNeedsQuoting(str)) forceQuotes = true;
- if (forceQuotes) os << '"';
- int len = str.length();
- for (int i = 0; i < len; i++) {
- char ch = str.at(i);
- switch (ch) {
- case '\a': os << "\\a"; break;
- case '\b': os << "\\b"; break;
- case '\f': os << "\\f"; break;
- case '\n': os << "\\n"; break;
- case '\r': os << "\\r"; break;
- case '\t': os << "\\t"; break;
- case '\v': os << "\\v"; break;
- case '"': os << oct << "\\" << (int(ch) & 0xFF); break;
- case '\\': os << "\\\\"; break;
- default:
- if (isprint(ch)) {
- os << ch;
- } else {
- ostringstream oss;
- oss << oct << (int(ch) & 0xFF);
- os << "\\" << oss.str();
- }
- }
- }
- if (forceQuotes) os << '"';
- }
在C++中,有两种类型的字符串:
- C类型字符串,来自于C编程语言
- C++类型string,C++实现的库
现在显式的转换C风格的字符串为C++类型的字符串,这样该代码是合法的。
1.对一个字符串进行逆序操作
- /* File: reverse.cpp
- *
- * Code to recursively reverse a string.
- */
- #include <iostream>
- #include <string>
- #include "simpio.h"
- using namespace std;
- string reverseString(string line);
- int main() {
- string line = getLine("Enter a string: ");
- cout << reverseString(line) << endl;
- }
- /* Returns the reverse of the indicated string. */
- string reverseString(string line) {
- /* If the string is empty, it's its own reverse */
- if (line == "") {
- return "";
- }
- /* Otherwise, reverse all but the first character, then tack
- * on the first character.
- */
- else {
- return reverseString(line.substr(1)) + line[0];
- }
- }
2.回文(palindrome)
- /* File: palindrome.cpp
- *
- * A program that reads a file of English words, then prints out all
- * the palindromic words.
- */
- #include <iostream>
- #include <string>
- #include <fstream>
- #include "simpio.h"
- using namespace std;
- bool isPalindrome(string text);
- int main() {
- /* Open the file for reading. We really should check whether
- * the file is open before proceeding.
- */
- string file = "dictionary.txt";
- ifstream input(file.c_str());
- /* Read each line of the file and print out those that are palindromes. */
- string line;
- while (getline(input, line)) {
- if (isPalindrome(line)) {
- cout << line << endl;
- }
- }
- return 0;
- }
- /* Returns whether the given string is a palindrome. */
- bool isPalindrome(string text) {
- /* All characters of length 0 or length 1 are guaranteed to
- * be palindromes.
- */
- if (text.length() <= 1) {
- return true;
- }
- /* If the first and last character of the string aren't the same,
- * the string cannot be a palindrome.
- */
- else if (text[0] != text[text.length() - 1]) {
- return false;
- }
- /* Otherwise, this string is a palindrome precisely when the middle
- * characters are a palindrome.
- */
- else {
- return isPalindrome(text.substr(1, text.length() - 2));
- }
- }
3.C++中从File中读取数据
- getline(file, str);
典型的读取文件中各行的循环如下所示:
- string line;
- while(getline(file, line))
- {
- /* ...process line... */
- }
回文的实现代码使用了文件的读取。
- type val;
- while(file >> val)
- {
- /* ... process val... */
- }
4.C++中参数传递
- 传值方式:参数通过拷贝传给一个函数。void myFunction(int x);
- 引用方式:传递给函数的变量在函数中是可以改变的。void myFunction(int &x)
- int main()
- {
- int x = 10;
- int y = 20;
- //here: x = 10, y = 20
- sum(x, y);
- //here: x = 10, y = 20
- swap(x, y);
- //here: x = 20, y = 10
- cout << x << " " << y << endl;
- return 0;
- }
- //Pass by reference
- void swap(int &x, int &y)
- {
- int temp = x;
- x = y;
- y = temp;
- }
- //Pass by value
- void printSum(int x, int y)
- {
- x += y;
- cout << x << endl;
- }
【stanford C++】字符串(String)与流(Stream)的更多相关文章
- delphi 字符串string转流TStream
function StringToFile(mString : string; mFileName : TFileName) : Boolean;var vFileChar : file of Cha ...
- C# 字符串string和内存流MemoryStream及比特数组byte[]之间相互转换
定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串转比特数组 复制代码 代码如下: (1)byte[] bt=System.Text.Encoding.Default.GetB ...
- c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换
字节数组byte[]与图片image之间的转化 字节数组转换成图片 public static Image byte2img(byte[] buffer) { MemoryStream ms = ne ...
- Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串
Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串 原理::syso 向ByteArrayOutputStream这个流理想write字节..然后可以使 ...
- 字符串string和内存流MemoryStream及比特数组byte[]互转
原文:字符串string和内存流MemoryStream及比特数组byte[]互转 字符串string和内存流MemoryStream及比特数组byte[]互转比较 定义string变量为str, ...
- 将String转化成Stream,将Stream转换成String, C# Stream 和 byte[] 之间的转换(文件流的应用)
static void Main( string[] args ) { string str = "Testing 1-2-3"; //convert string 2 strea ...
- nodeJS之流stream
前面的话 当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流.NodeJS中通过各种Stream来提供对数据流的操作.本文将详细说明NodeJS中的流strea ...
- Java笔记:Java 流(Stream)、文件(File)和IO
更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...
- Java - 17 Java 流(Stream)、文件(File)和IO
Java 流(Stream).文件(File)和IO Java.io包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io包中的流支持很多种格式,比如:基本类型. ...
随机推荐
- 错 'Cannot run program "/home/uv/IDE/adt/sdk/platform-tools/adb": error=2, No such file or directory
为linux平台搭建android开发环境的人,您可能会遇到问题,如下面有: 64位置linux安装64位置eclipse和64位置jdk开场后eclipse错误后 ""Canno ...
- phpStorm+XDebug+chrome 配置
运行环境: phpStorm 10.0.1 PHP 5.6.24 VC11 x86 Thread Safe Xdebug 2.4.1(PHP 5.6 VC11 TS (32 bit) 1. PHP安装 ...
- dd命令简单易用,例如
dd命令简单易用,例如 bs单位,count为写入的范围区间,例如以下举例: 例:使用dd清除vote disk和ocr(裸设备) $dd if=/dev/zero of=/dev/rrac_ocr ...
- Java 多线程之happens-before规则解释
关于happens-before规则的解释网上有很多,我就不敢班门弄斧了.贴出两篇不错的文章以供学习. 1.happens-before俗解 2.深入Java内存模型--happen-before规则
- [译]在运行时内存中的Java对象是怎么样的
(文章翻译自What do Java objects look like in memory during run-time?) 我们知道函数在内存中是作为一个活动记录栈来实现的.而且我们知道Java ...
- Objective C多态
面向对象的封装的三个基本特征是.继承和多态. 包是一组简单的数据结构和定义相关的操作在上面的其合并成一个类,继承1种亲子关系,子类能够拥有父类定的成员变量.属性以及方法. 多态就是指父类中定义的成员变 ...
- cocos2d的-X- luaproject的LUA脚本加密
2014/1/26 更新 近期又发现了一个非常easy的方法,事实上coco2dx已经给我们提供设置loader的方法. 注意:有个局限性,在非android平台下调用pEngine->exec ...
- WebIM(2)---消息缓存
WebIM系列文章 在一步一步打造WebIM(1)一文中,已经介绍了如何实现一个简单的WebIM,但是,这个WebIM有一个问题,就是每一次添加消息监听器时,都必须访问一次数据库去查询是否有消息,显然 ...
- js 设为首页、加入收藏
// 加入收藏 <a onclick="AddFavorite(window.location,document.title)">加入收藏</a>func ...
- MVC Filter 实现方式和作用范围控制
Asp.Net MVC Filter 实现方式和作用范围控制 MVC中的Filte 简单又优雅的实现了AOP ,在日志,权限,缓存和异常处理等方面用的比较多.但本文不是讨论Filter这些功能点,而是 ...