添加完 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环境中
...全文
90 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
给个输入例子先。

65,187

社区成员

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

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