文章目录数字与
字符串的转换C++的stringstream类(来源:\)C标准库sprintf、sscanf函数(来源:数字与
字符串的转换
C++的stringstream类(来源:<sstream>)
1.
字符串到数字
string str = "854";
stringstream sstr(str);
int x;
sstr >> x;//即从sstr中提取
数据
C风格字符串
尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们。这是因为C风格字符串不仅使用起来不方便,而且极其容易引发程序漏洞,是诸多安全问题的根本原因。C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定俗成的写法。
|函数 | 说明 |
| strlen() |返回p的长度,空字符不计算在内|
| strcmp(p1,p2) | 比较p1和p2的相等性。如果p1==p2,返回0;如果p1>p2,返回一个正值,否则返回负值 |
| strcat(p1,p2)
流和缓冲区
c++ 程序把输入和输出看做字节流.输入时,程序从输入流中抽取字节,输出时,程序将字节插入到输出流中.
缓冲区:缓冲区可以搞笑的处理输入和输出.缓冲区是作用中介的内存块,它是将信息从设备传输到程序,或从程序传输给设备的临时存储工具.
缓冲方法: 从磁盘上读取大量信息,将这些信息存储在缓冲区,然后每次从缓冲区里读取一个字节,因为从内存中读取单个字节的速度比从硬盘上读取快的多,所以 缓冲方...
1. 请创建一个抽象类DataStructure,该类包括下面的成员变量和成员函数:
1) 一个成员变量len,表示里面的元素个数最大值
2) 构造函数DataStructure(int l),将len初始化为0
3) 虚析构函数~DataStructure()
4) 纯虚函数Output(),输出DataStructure中的数据
5) 纯虚函数Size(),返回DataStructure中的元素个数
2. 请创建DataStructure的一个派生类MyString,该类包括下面的成员变量和成员函数:
1) 一个成员变量char* data,表示里面的数据
2) 构造函数MyString(int max_size),将MyString初始化为空串,最大元素个数为max_size
3) 析构函数~MyString(),释放相应的数据
4) Input()函数,往MyString输入数据
5) 重载operator+=()函数,实现两个字符串的连接
6) 重定义Output()和Size()函数
3. 请创建DataStructure的一个派生类MyStack,该类包括下面的成员变量和成员函数:
1) 一个成员变量int* data,用于里面的数据
2) 一个成员变量int top,表示最上面的元素下标
3) 构造函数MyStack(int max_size),将MyStack初始化为空栈,最大元素个数为max_size
4) 析构函数~MyStack(),释放相应的数据
5) Push_back(int e)函数,往栈里面压入一个数据e
6) 重定义Output()和Size()函数
4. 请编写main函数,测试上面程序的正确性
1) 创建两个MyString的对象str1和str2,分别调用Input函数输入str1和str2,然后分别调用operator+=函数将str2连接到str1的末尾
2) 创建一个MyStack的对象stack,调用Push_back函数输入往stack中输入m(m < max_size)个数据
3) 创建一个长度为3的DataStructure*类型的数组,将其3个元素分别指向str1, str2, stack,然后编写for循环调用Size()和Output()函数输出每个元素的大小和内容。
5. 输入输出样例:
1) 输入样例
A promising techni
que for checking reachability
12 23 34 45
2) 输出样例
A promising technique for checking reachability
que for checking reachability
12 23 34 45
#define EPS 1e-5 //定义精度常数
using namespace std; //使用标准空间命名std
namespace NameCComplex //定义命名空间NameCComplex
class CComplex ////定义一个CComplex类
private:
double Real,Image;
public:
CComplex(double real=0,double image=0) //构造函数
Real=real;
Image=image;
friend istream & operator>>(istream &is,CComplex &com); //重载输入
friend ostream & operator<(CComplex &com);
int operator(CComplex &com) //重载运算符">",比较模的大小
if(mod()>com.mod())
return 1;
return 0;
int CComplex::operator<(CComplex &com)
if(mod()>(istream &is,CComplex &com) //重载输入,可以输入a+bi的形式
cout<>s; //用
字符串的形式接受复数
int len=strlen(s); //求出
字符串的
长度
int n=0,sign=1;
//n为当前从
字符串中提取出来的数字,初始化为0;sign是难道符号,初始化为正
com.Image=com.Real=0;
for(int k=0;k<len;k++) //判断接受的
字符串是否合法
if((s[k] '9') && (s[k]!='+' && s[k]!='-' && s[k]!='i'))
cout<<"error"<<endl;
return is; //错误,输出出错信息并返回
for(k=0;k<len;) //顺序识别
字符串中各字符
if(n!=0 &&(s[k]=='-'||s[k]=='+')) //当前字符是否是符号位
com.Real=sign*n;
//是符号位,且n!=0,即n已被赋值,表明当前读取的是虚部的符号
n=0; //将原n*sign值赋给实部,将n清零,准备接受虚部的值
if(s[k]=='-') //当前字符为负号
sign=-1;k++; //给符号标志赋值
if(s[k]=='+') //当前字符为正号
sign=1;k++; //给符号标志赋值
if(s[k]=='i') //当前字符为'I'
if(k!=len-1) //判断字符'I'是否为
字符串中作后一个字符
cout<='0' && s[k]<='9')
//当前字符在0~9之间,将数字字符转换成数字数值
n=n*10+s[k]-'0';
if(s[len-1]!='i' && n!=0)
//如果最后一个字符不是'I',表示复数对象内只有实部,没有虚部
com.Real=n*sign;
return is;
ostream & operator<<(ostream &os,CComplex &com) //重载输入
if(fabs(com.Image)<EPS) // 如果虚部为0
os<<com.Real; //只输出实部
else if((fabs(com.Real)<EPS)) //如果实部为0
os<<com.Image<0)
os<<com.Real<<"+"<<com.Image<<"i";
os<<com.Real<<com.Image<<"i"; //虚部为正
return os;
CComplex CComplex::operator+(CComplex &com) //加法重载
CComplex sum;
sum.Real=Real+com.Real; //实部相加
sum.Image=Image+com.Image; //虚部相加
return sum;
CComplex CComplex::operator*(CComplex &com) //乘法重载
CComplex multi;
multi.Real=Real*com.Real-Image*com.Image; //乘积实部
multi.Image=Real*com.Image+Image*com.Real; //乘积虚部
return multi;
CComplex CComplex::operator-(CComplex &com) //减法重载
CComplex sub;
sub.Real=Real-com.Real;
sub.Image=Image-com.Image;
return sub;
CComplex CComplex::operator+=(CComplex &com) //重载加法赋值
Real=Real+com.Real;
Image=Image+com.Image;
return *this;
CComplex CComplex::operator-=(CComplex &com) //重载减法赋值
Real=Real-com.Real;
Image=Image-com.Image;
return *this;
CComplex CComplex::operator*=(CComplex &com) //重载乘法赋值
double nReal=Real*com.Real-Image*com.Image;
double nImage=Real*com.Image+Image*com.Real;
Real=nReal;
Image=nImage;
return *this;
int CComplex::operator==(CComplex &com) //重载等于
if(Real==com.Real && Image==com.Image)
return 1;
return 0;
void Test(void) //测试函数
user.nTest++;
cout<<"共10道题,做100以内的加减运算,满分100分:\n";
double real1,real2,image1,image2,real3,real4,image3,image4;
CComplex answer,temp;
int score=0;
char op;
for(int i=0;i<=9;i++)
/////为复数产生随机值
real1=rand()%200-100;
image1=rand()%200-100;
real2=rand()%200-100;
image2=rand()%200-100;
CComplex a(real1,image1),b(real2,image2);
real3=rand()%20-10;
image3=rand()%20-10;
real4=rand()%20-10;
image4=rand()%20-10;
CComplex c(real3,image3),d(real4,image4);
op=rand()%3; //产生随机加减乘法运算的三个值
switch(op)
case 0:
answer=a+b;
cout<<a<<"加上"<<b<<"等于";
break;
case 1:
answer=a-b;
cout<<a<<"减去"<<b<<"等于";
break;
case 2:
answer=c*d;
cout<<c<<"乘以"<<d<>temp; //输入用户计算值
if(answer==temp) //比较用户计算值
score+=10;
cout<<"此题做错了\n";
cout<<"正确答案为:"<<answer<<endl;
cout<<"你的最后得分是:"<<score<<endl;
if(user.nTest<=3)
user.alAve=0;
user.dlScore[user.nTest-1]=score;
for(int i=0;i<user.nTest;i++)
user.alAve+=user.dlScore[i];
user.alAve=user.alAve/user.nTest;
user.dlScore[0]=user.dlScore[1];
user.dlScore[1]=user.dlScore[2];
user.dlScore[2]=score;
for(i=0,user.alAve=0;i<3;i++)
user.alAve+=user.dlScore[i];
user.alAve=user.alAve/3;
cout<<"请按任意键继续\n";
cout.flush();
cin.get();
cin.get();
void Add() //复数加法运算函数
user.nAdd++;
CComplex num1,num2,sum,Zero(0,0);
cout<<"加法计算\n"<<"最少输入两个复数,并且以0结束\n";
cout<>num1;
cout<>num2;
sum=num1+num2;
cout<>num1;
int i=4;
while(!(num1==Zero))
sum=sum+num1;
cout<<"第"<<i<>num1;
cout<<"加法结果是:"<<sum<<endl;
cout<<"请按任意键继续\n";
cout.flush();
cin.get();
cin.get();
void Sub() //复数减法预算函数
user.nSub++;
CComplex num1,num2,sub,Zero(0,0);
cout<<"最少输入两个复数,并且以0结束\n";
cout<>num1;
cout<>num2;
sub=num1-num2;
cout<>num1;
int i=4;
while(!(num1==Zero))
sub=sub-num1;
cout<<"第"<<i<>num1;
cout<<"减法结果是:"<<sub<<endl;
cout<<"请按任意键继续\n";
cout.flush();
cin.get();
cin.get();
void Mul() //复数乘积函数
user.nMul++;
CComplex num1,num2,mul,Zero(0,0);
cout<<"乘法计算\n"<<"最少输入两个复数,并且以零结束\n";
cout<>num1;
cout<>num2;
mul=num1*num2;
cout<>num1;
int i=4;
while(!(num1==Zero))
mul*=num1;
cout<<"第"<<i<>num1;
cout<<"乘法结果是:"<<mul<<endl;
cout<>num1;
++num1;
cout<<"自加的结果为"<<num1<<endl;
cout<>num1;
--num1;
cout<<"自减的结果为"<<num1<<endl;
cout<<"按任意键结束\n";
cout.flush();
cin.get();
cin.get();
void compare() //两复数比较函数
CComplex num1,num2;
cout<<"输入两个复数\n";
cout<>num1;
cout<>num2;
if(num1==num2)
cout<num2)
cout<<num1<<"的模大于"<<num2<<"的模\n";
else if(num1<num2)
cout<<num2<<"的模大于"<<num1<<"的模\n";
cout<<"这两个复数的模相等\n";
cout<<"按任意键继续\n";
cin.get();
cin.get();
void userprint() //输出用户信息函数
cout<<user.szName<<"使用的次数为:"<<user.nTime<<endl;
cout<<"其中:\t加法的次数:"<<user.nAdd<<"\t减法的次数:"<<user.nSub<<"\t乘法的次数:"<<user.nMul<<endl;
cout<<"\t测试次数:"<<user.nTest<<"\t平均成绩:"<<user.alAve<<endl;
void Login() //当前用户信息函数
char szName[20];
cout<<"请输入您的姓名:";
cin.getline(szName,20);
ifstream infile;
User user1;
infile.open("user.dat",ios::binary|ios::in);
if(!infile)
cout<<"没有原始记录文件,您是第一个用户!\n";
strcpy(user.szName,szName);
user.nTest++;
return;
infile.read((char *)&user1,sizeof(User));
while(!infile.eof())
if(strcmp(user1.szName,szName)==0)
user=user1;
user.nTime++;
cout<<"欢迎您再次使用复数计算器!";
userprint();
cin.get();
infile.close();
return;
infile.read((char *) &user1,sizeof(User));
cout<<"欢迎您再次使用复数计算器!";
strcpy(user.szName,szName);
user.nTime++;
infile.close();
return;
void SaveFile() //用户资料保存函数
userprint();
fstream file;
User user1;
file.open("user.dat",ios::binary|ios::in|ios::out);
if(!file)
cout<<"文件打开错误,不能进行更新!\n";
return;
file.seekp(0,ios::beg);
while(!file.eof())
file.read((char *)&user1,sizeof(User));
if(strcmp(user1.szName,user.szName)==0)
file.seekp(-(sizeof(User)),ios::cur);
file.write((char *)&user,sizeof(User));
file.close();
return;
file.close();
fstream outfile;
outfile.open("user.dat",ios::binary|ios::app);
outfile.write((char *)&user,sizeof(User));
outfile.close();
return;
using namespace NameCComplex;
int main(void) //主函数开始
srand(time(NULL)); //初始化随机数“种子”语句
Login(); //当前用户信息函数
char strChoise[20]; //定义
字符串名
system("cls");
cout<<"\t这是一个简单的复数计算器程序,可以实现以下功能,请按对应的按键(1-7)\n\n\n";
cout<<"\t=========================MENU===========================\n";
cout<<"\t1:多复数加法,以0结束\n";
cout<<"\t2:多复数减法,以0结束\n";
cout<<"\t3:测试100以内的复数加减乘法运算,1次测试10道题\n";
cout<<"\t4:多复数乘法,以0结束\n";
cout<<"\t5:复数自加\n:";
cout<<"\t6:复数自减\n:";
cout<<"\t7:复数比较\n:";
cout<<"\t0:退出程序\n\n:";
cout<>strChoise;
if(strcmp(strChoise,"1")==0) //用户选1则调用Add()函数
Add();
else if(strcmp(strChoise,"2")==0) //用户选2则调用Sub()函数
Sub();
else if(strcmp(strChoise,"3")==0) //用户选3则调用Test()函数
Test();
else if(strcmp(strChoise,"4")==0) //用户选4则调用Add()函数
Mul();
else if(strcmp(strChoise,"5")==0) //用户选5调用Add1()函数
Add1();
else if(strcmp(strChoise,"6")==0) //用户选6则调用Sub1()函数
Sub1();
else if(strcmp(strChoise,"7")==0) //用户选7则调用Compare()函数
compare();
else if(strcmp(strChoise,"0")==0) //用户选0则结束调用函数
cout<<"\n\n\t欢迎下次继续使用复数计算器!\n\n";
break;
cout<<"\n\t输入错误,请按任意键继续!\n";
cin.get();
cin.get();
while((strcmp(strChoise,"0")));
SaveFile(); //调用用户资料保存函数
return 0;
scanf("%s", str);
printf("The string in reverse order is: ");
for (i = strlen(str) - 1; i >= 0; i--)
printf("%c", str[i]);
return 0;
### 回答2:
要用C语言编写一个
字符串降序的程序,可以按照以下步骤进行实现:
1. 首先,定义一个
字符串变量,并初始化为需要排序的
字符串。
2. 使用标准库函数strlen()获取
字符串的
长度,得到
字符串的字符数。
3. 创建一个整型变量i和j,用于循环和交换操作。
4. 使用嵌套循环来比较和交换
字符串中的字符,使其按照降序排列。外层循环遍历
字符串中的每个字符,从第一个字符一直到倒数第二个字符。内层循环则从外层循环的下一个字符开始,依次与外层循环指定的字符进行比较,并根据需要进行交换操作。
5. 使用临时变量来进行交换。如果内层循环指定的字符比外层循环指定的字符要大,则使用一个临时变量temp将两个字符交换位置。
6. 完成排序后,将排序后的
字符串输出或保存。
以下是一个示例代码:
#include <stdio.h>
#include <string.h>
int main() {
char str[100] = "cba"; // 初始化
字符串
int len = strlen(str); // 获取字符数
// 冒泡排序
for (int i = 0; i < len - 1; i++) {
for (int j = i + 1; j < len; j++) {
if (str[j] > str[i]) {
char temp = str[j];
str[j] = str[i];
str[i] = temp;
printf("降序排列后的
字符串: %s\n", str);
return 0;
以上代码使用冒泡排序算法对
字符串进行降序排列,并输出排序后的结果。在这个示例中,初始的
字符串为"cba",经过排序后得到的结果为"cba"。
### 回答3:
要用C语言编写一个
字符串降序的程序,可以使用标准库中的
字符串操作函数来实现。下面是一个简单的实现示例:
#include <stdio.h>
#include <string.h>
// 比较函数,用于按字典序比较两个
字符串
int compare(const void *a, const void *b) {
return strcmp(*(const char **)b, *(const char **)a);
int main() {
char str[100][100]; // 定义一个二维字符数组保存多个
字符串
int n, i;
printf("请输入
字符串个数:");
scanf("%d", &n);
printf("请输入%d个
字符串:\n", n);
for (i = 0; i < n; i++) {
scanf("%s", str[i]);
// 使用标准库中的快速排序函数对
字符串数组进行降序排序
qsort(str, n, sizeof(char *), compare);
printf("降序排序后的
字符串为:\n");
for (i = 0; i < n; i++) {
printf("%s\n", str[i]);
return 0;
以上程序中,首先定义了一个二维字符数组`str`用于保存输入的多个
字符串。然后通过`scanf`函数分别读入
字符串的数量和具体的
字符串。接下来使用`qsort`函数对
字符串数组进行排序,排序方法由自定义的`compare`函数指定,该函数使用`strcmp`函数对两个
字符串进行字典序比较,并返回比较结果。最后在屏幕上输出排序后的
字符串数组即可。