C和C++中字符串操作
来源:互联网 发布:淘宝找不到自己的品牌 编辑:程序博客网 时间:2024/06/05 09:36
C和C++中字符串操作
string变量(对象)就是面向对象编程中的“对象”的一个很好的例子。下面我们比较一下C语言与C++语言中处理字符串的不同方式,对面向过程和面向对象编程有一个感性认识。
C语言中有很多字符串操作函数,常见的有:
- 字符串复制:
char *strcpy(char *s1, const char *s2);
- 求字符串长度:
size_t strlen(const char *s);
- 字符串拼接:
char *strcat(char *s1, const char *s2);
- 字符串比较:
int strcmp(const char *s1, const char *s2);
以求字符串长度为例,我们来看看用C语言的方式怎样处理:
#include <stdio.h>#include <string.h>int main(){ char one_line[20]; int length; gets(one_line); // 像C++中的getline那样,可以输入含有空格的字符串 length = strlen(one_line); printf("the length of \"%s\" is %d\n", one_line, length); return 0;}
C++中字符串保存在string类型的变量(对象)中,而与上述字符串操作对应的操作:
- 字符串复制:
string& assign (const string& str);
- 求字符串长度:
size_t length() const;
- 字符串拼接:
string& append (const string& str);
- 字符串比较:
int compare (const string& str) const;
与C语言的那些函数最大的不同的是,上述函数是属于string变量自身的函数,调用方式是变量名.函数名(...);
。
以求字符串长度为例,我们来看看用C++语言的方式怎样处理:
#include <iostream>#include <string>int main(){ std::string one_line; int length; getline(std::cin, one_line); length = one_line.length(); // length是one_line的一个函数(方法) std::cout << "the length of \"" << one_line << "\" is " << length << std::endl; return 0;}
尽管上述的两个例子很小,但是也反映了面向过程和面向对象编程的一个重大区别:面向过程程序中变量由变量“外部”函数进行处理,而面向对象程序中处理某个变量的方式往往是调用属于其“内部”的函数,这种变量(对象)内的函数也叫成员函数。
可能有人会问,不都是达到我们使用字符串的目的吗,这种区别有更大的意义吗?
现实中的事物(以C语言中的结构体变量或者C++中的对象来表达的居多)很多都有自己的行为(函数)。如果将这些行为划归于这个事物自身,而不是事物的外部,更加有利于程序员在现实问题和程序之间建立对应。面向过程中的关注点更加偏重于处理变量的那些“动态”过程,而面向对象中关注点更加偏重于含有一定成员函数的“静态”对象。这更有利于码农们进行程序设计和程序调试。含有函数的变量(对象)起到了某种支点的作用。
这种函数归属于变量的特性反映了面向对象三大特性中的封装特性,封装性也是另两大特性,即继承和多态的基础。
一个例子
下面的程序称为姓名装框程序,你可以输入姓名,程序输出问候语,并且将问候语恰好放在由’*’号组成的框中。
思考一下,利用C语言的方式处理这个程序应该如何下手?
…10分钟过去了
可能有些同学首先想到进行各种字符串输出,直到最终输出成图片中的样子。这里我推荐对应各行输出内容建立一个字符数组,先将输出的字符串保存到字符数组中,最后一起输出它们。这样程序逻辑相对清晰,而且输出的第5行和第1行相同,第4行和第2行相同,我们只要建立保存前3行字符串的3个字符数组即可。各位可以思考下用户输入的姓名保存到单独的字符数组后,先“组装”哪行数组呢。
下面给出部分代码
#include <iostream>using namespace std;// 确保输入姓名不超过20个字节#define MAX_NAME_LENGTH 20// 确保每行最长不超过40个字节#define MAX_LINE_LENGTH 40int main(){ char line1[MAX_LINE_LENGTH + 1] = {0}; char line2[MAX_LINE_LENGTH + 1] = {0}; char line3[MAX_LINE_LENGTH + 1] = {"* 你好,"}; char name[MAX_NAME_LENGTH + 1] = {0}; int line_width; printf("请输入姓名:"); gets(name); strcat(line3, name); strcat(line3, "! *"); line_width = strlen(line3); // 开始组装其它行 ... // 结束组装其它行 printf("%s\n", line1); printf("%s\n", line2); printf("%s\n", line3); printf("%s\n", line2); printf("%s\n", line1); return 0;}
注意,在组装各行字符串的时候,小心结束字符’\0’。
C语言的程序编写完成,可以再用C++中string对象来解决这个问题。string对象可以自动管理保存字符串的大小,使用它我们就不需要考虑大小问题了。
#include <iostream>#include <string>using namespace std;int main(){ string line1, line2, line3(""* 你好,""), name; int line_width; cout << "请输入姓名:"; cin >> name; line3.append(name); // 或者 line3 += name; line3.append("! *"); // 或者 line3 += "! *"; line_width = line3.length(); // 开始组装其它行 ... // 结束组装其它行 cout << line1 << endl; cout << line2 << endl; cout << line3 << endl; cout << line2 << endl; cout << line1 << endl; return 0;}
可以猜到string line3(“”* 你好,”“); 是定义string变量,并且以括号里的字符串初始化它。
以上就是以C++方式编写的程序。可以看到,C++中的变量“自带”方法,这个就是封装的体现。同时也可以看到,尽管使用了面向对象的类,但是各体来说处理流程还是过程式的。面向对象只是一种代码组织方式,在实际编程过程中面向过程和面向对象都是需要的。
上一篇:字符串和基本输入输出
下一篇:引用和函数重载
- C和C++中字符串操作
- C中字符串操作
- C语言中操作字符串
- C中字符串常见操作
- C中字符串操作函数
- [c]c中c串和字符串
- c字符和字符串操作
- C中对于字符串的操作总结
- C语言中字符串操作要点
- C/C++中 宏定义字符串 操作
- C/C++中 宏定义字符串 操作
- c语言中操作字符串的函数
- c 中字符串 的相关操作
- C语言中字符串操作之 strstr()
- Linux C 中字符串化操作符#
- C中字符串操作函数strstr strchr
- C语言中字符串操作之 strstr()
- c语言中字符串操作的函数
- Reactive Programming with RxJava-Chapter3:Operators and Transformations(2)
- lstm
- 子类调用父类构造器时的Java类成员初始化顺序
- JDOM 和 DOM4J
- 反射问题
- C和C++中字符串操作
- 《CSS权威指南第三版》第五章的读书笔记
- Web基础之Ajax
- Implement Trie (Prefix Tree)
- MongoDB游标的基本操作
- leetcode3. Longest Substring Without Repeating Characters
- [Spring实战系列]
- UVA
- MongoDB基础学习一 ---- MongoDB的基本使用