本文参照于狄泰软件学院,唐佐林老师的——《C++深度剖析教程》
C语言遗留问题
- C语言不支持真正意义上的字符串
- C语言用字符数组和一组函数实现字符串操作
- C语言不支持自定义类型,因此无法获得字符串类型。
但是实际工程开发中,大多数情况都需要进行字符串处理,所以这个问题需要解决。而在 C++中是这样解决这个问题的:
- 从C到C++的进化过程引入了自定义类型
- 在C++中可以通过类完成字符串类型的定义。
C++中的字符串类
问题:C++中的原生类型系统是否直接包含字符串类型?
因为C++语言直接C语言的所有概念,所以C++语言中没有原生的字符串类型。C++中的字符串类型是通过标准库提供的string类来实现的。
1. string类直接支持字符串连接
2. string类直接支持字符串的大小比较
3. string类直接支持子串查找和提取
4. string类直接支持字符串的插入和替换
这些实现,依赖了C++的操作符重载的机制。所以在C语言无法用结构体来实现string类。只能依赖于函数来进行字符串操作的功能。
示例代码:C++中的字符串类的使用
#include <iostream>
#include <string>
using namespace std;
void string_sort(string a[], int len)
{
for(int i=0; i<len; i++)
{
for(int j=i; j<len; j++)
{
if( a[i] > a[j] )
{
swap(a[i], a[j]);
}
}
}
}
string string_add(string a[], int len)
{
string ret = "";
for(int i=0; i<len; i++)
{
ret += a[i] + "; ";
}
return ret;
}
int main()
{
string sa[7] =
{
"Hello World",
"D.T.Software",
"C#",
"Java",
"C++",
"Python",
"TypeScript"
};
string_sort(sa, 7);
for(int i=0; i<7; i++)
{
cout << sa[i] << endl;
}
cout << endl;
cout << string_add(sa, 7) << endl;
return 0;
}
问题:那么在C语言中应该如何实现呢?
#include <stdio.h>
#include <string.h>
void string_sort(char a[7][16], int len)
{
int i = 0, j = 0;
char buf[16] = "";
for(i = 0; i < len; i++)
{
for(j = i; j < len; j++)
{
if(*a[i] > *a[j])
{
strcpy(buf,a[i]);
strcpy(a[i],a[j]);
strcpy(a[j],buf);
}
}
}
}
int main()
{
int i = 0;
char sa[7][16] =
{
"Hello World",
"D.T.Software",
"C#",
"Java",
"C++",
"Python",
"TypeScript"
};
string_sort(sa, 7);
for(i=0; i<7; i++)
{
printf("%s\n",sa[i]);
}
return 0;
}
分析:
(1) 从代码我们可以看出:C++代码比C语言简洁。没有出现任何指针运算,并且不需要中间字符串变量。
(2) C语言中只能有字符串数组来实现,不能用char*实现,因为指针字符串是不能被修改的。(因为指针字符串存放在代码段)
(3) C语言的可移植性比C++的差,数组需要固定大小。
这样看来,string类的应用使得问题的求解变得简单。
字符串与数字的转换
- 标准库中提供了相关的类对字符串和数字进行转换
- 字符串类sstream用于string的转换
- 相关头文件
- istringstream 字符串输入流
- ostringstream 字符串输出流
示例代码:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
#define TO_NUMBER(s, n) (istringstream(s) >> n)
#define TO_STRING(n) (((ostringstream&)(ostringstream() << n)).str())
int main()
{
double n = 0;
if( TO_NUMBER("234.567", n) )
{
cout << n << endl;
}
string s = TO_STRING(12345);
cout << s << endl;
return 0;
}