添加完 strcspn 函数之后怎么会DAMAGE呢? C++

guzhebo001 2009-01-24 02:56:32
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;


class StringParser
{
private:
int pos;
char *input_str;
char *delimiters;

public:
StringParser(char *inp, char *delim)
{
input_str = inp; delimiters = delim; pos = 0;
}
StringParser(char *inp)
{
input_str = inp; delimiters = ","; pos = 0;
}

char *get();
int get_int();
int more() {return input_str[pos] != '\0'; }
void reset() {pos = 0;}
};

int main()
{
char input_str[100];
char *p;

cout<<"Enter input line: ";
cin.getline(input_str,99);

StringParser parser(input_str,"/,");

while (parser.more())
{
p = parser.get();//获取指向新分配的字符串的指针
cout<< p << endl;//打印它
delete [] p;
}

return 0;
}


//函数实现部分

char *StringParser::get()
{
int j = 0;
char *new_str;


//用掉初始定界符(如果有的话)
while (strchr(delimiters,input_str[pos]))
pos++;
int substring_size = strcspn (input_str + pos,delimiters); //就是这个函数
new_str = new char[substring_size];


// 只要字符不是定界符或者字符串尾(NULL),就拷贝它
while (input_str[pos] != '\0' &&
! strchr(delimiters,input_str[pos]))

new_str[j++] = input_str[pos++];
//结束字符串,并返回它
new_str[j] = '\0';
return new_str;
}

int StringParser::get_int()
{
char *p = get();
return atoi(p);
delete [] p;
}
///////////////////////////////////////////////////////////////
要是采用以下形式 则没有问题,请问下是什么原因

char *StringParser::get()
{
int j = 0;
char *new_str;
new_str = new char[100];

//用掉初始定界符(如果有的话)
while (strchr(delimiters,input_str[pos]))
pos++;



// 只要字符不是定界符或者字符串尾(NULL),就拷贝它
while (input_str[pos] != '\0' &&
! strchr(delimiters,input_str[pos]))

new_str[j++] = input_str[pos++];
//结束字符串,并返回它
new_str[j] = '\0';
return new_str;
}

在Visual C++ 6.0环境中
...全文
135 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
guzhebo001 2009-01-24
  • 打赏
  • 举报
回复
get 算法如下:

分配新字符串(所需的内存空间)
在当前字符是一个定界符的情况下,
忽略该字符,是“当前位置”跳到下一个字符
在当前字符不是一个定界符,也不为null的情况下,
将这个字符拷贝到新字符串,并且使“当前位置”
跳到下一个字符
在新字符串末尾附加一个null
返回指向新字符串的指针
xiaoyisnail 2009-01-24
  • 打赏
  • 举报
回复

#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;


class StringParser
{
private:
int pos;
char *input_str;
char *delimiters;

public:
StringParser(char *inp, char *delim)
{
input_str = inp; delimiters = delim; pos = 0;
}
StringParser(char *inp)
{
input_str = inp; delimiters = ","; pos = 0;
}

char *get();
int get_int();
int more() {return input_str[pos] != '\0'; }
void reset() {pos = 0;}
};

int main()
{
char input_str[100] = {0};//记得初始化
char *p;

cout <<"Enter input line: ";
cin.getline(input_str,99);

StringParser parser(input_str,"/,");

while(parser.more())
{
p = parser.get();
cout << p << endl;
delete [] p;
}

return 0;
}

char *StringParser::get()
{
int i;
char *new_str;

while (strchr(delimiters,input_str[pos]))
pos++;

int substring_size = strcspn (input_str + pos,delimiters);

new_str = new char[substring_size+1];

for(i=0;i<substring_size;i++)
new_str[i] = input_str[pos+i];

new_str[substring_size] = '\0';

input_str=input_str+pos+substring_size+1;
pos=0;

return new_str;
}

int StringParser::get_int()
{
char *p = get();
return atoi(p);
delete [] p;
}
xiaoyisnail 2009-01-24
  • 打赏
  • 举报
回复
get里的逻辑都不对,new_str里存的到底是什么?
while (input_str[pos] != '\0' && !strchr(delimiters,input_str[pos]))
new_str[j++] = input_str[pos++];
这句是把分隔符后面的内容拷到new_str里,而new_str分配的大小确实分隔符前的字符串长度
guzhebo001 2009-01-24
  • 打赏
  • 举报
回复
比如输入 2,3/,5/8

输出 2
3
5
8

这里 的 "/" 和 "," 是分界符
hityct1 2009-01-24
  • 打赏
  • 举报
回复
给个输入例子先。
内容概要:本文介绍了使用电磁暂态程序(EMTP)对电力变压器在多种运行情景下进行建模与仿真分析的研究,涵盖正常运行、一次绕组故障以及铁芯故障等典型工况。通过Matlab代码实现,构建了高精度的变压器电磁暂态模型,能够精确模拟其内部电压、电流的动态变化过程,有效评估变压器在不同故障条件下的响应特性与系统稳定性。该研究不仅为变压器的故障诊断提供了可靠的仿真手段,也为电力系统中关键设备的设计优化、运行维护及保护策略开发提供了有力的理论支撑和技术路径。; 适合人群:具备电力系统分析基础知识和Matlab编程能力的高校师生、科研人员及从事电力系统仿真与设备状态监测的工程技术人员。; 使用场景及目标:①应用于高校教学与课程设计,帮助学生深入理解变压器的工作原理与典型故障机理;②服务于科研机构,支持新型变压器保护算法与故障识别技术的开发与验证;③助力电力企业开展设备健康状态评估、故障预警与运维决策,提升电网运行的安全性与可靠性。; 阅读建议:读者应结合文中提供的Matlab代码进行实践操作,重点观察并分析不同故障场景下系统电气量的暂态响应特征,深入掌握EMTP在电力系统电磁暂态分析中的建模方法与应用技巧。
内容概要:本文介绍了基于NVMe(非易失性内存主机控制器接口规范)的固态硬盘(SSD)架构案例研究,重点阐述了NVMe作为高性能、低延迟的标准化协议,如何通过PCIe接口提升SSD性能。文章分析了传统SSD架构的局限性,提出采用基于非阻塞交换结构(Fabric Based)的新型SSD架构,实现控制与数据路径分离,支持并行数据流、服务质量(QoS)保障以及异步消息传递机制,从而满足高并发I/O处理、后台操作不干扰主机请求、均匀写入分布以延长闪存寿命等关键需求。同时详细讲解了NVMe的队列模型、命令提交与成流程、双端口命名空间支持及固定大小命令格式等核心技术特点。; 适合人群:从事存储系统设计、固态硬盘开发、高速接口协议研究的工程师和技术人员,以及对NVMe协议和现代SSD架构有深入学习需求的高校研究人员或研究生。; 使用场景及目标:①理解NVMe协议如何优化PCIe SSD的性能与可扩展性;②掌握基于交换结构的SSD架构设计原理,用于高性能存储产品开发;③为下一代非易失性存储器(如PCM等)的控制器设计提供参考架构。; 阅读建议:本资料技术性强,建议结合NVMe协议标准文档及相关硬件架构知识进行系统学习,并关注其中的数据流调度、FTL协同优化及多通道并行处理机制的实际应用。

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧