当我运行我的程序时我的指针有问题我收到了一个分段falut(核心转储)任何人都可以帮助我知道哪个部分发生了这个错误?
这是一个通过获取分裂器来分割句子的程序,我使用了两个提到的数组
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
char Sentence[255];
cin.getline(Sentence,255);
char splitter='_';
int lenOfStr=0;
int numOfWords=1;
while (Sentence[lenOfStr]!='\0'){
if (Sentence[lenOfStr]==splitter) numOfWords++;
lenOfStr++;
}
char** words=new char* [numOfWords];
int* lenOfEachWord=new int[numOfWords];
int lenth=0,wordNum=0;
for (int i=0;i<lenOfStr;i++){
if (Sentence[i]==splitter) {
lenOfEachWord[wordNum]=lenth;
lenth=0;
wordNum++;
}
else lenth++;
}
for (int word=0;word<numOfWords;word++){
int lenth=lenOfEachWord[word];
words[word]=new char[lenth];
}
int word=0;
int chr=0;
while (chr<lenOfStr){
for (int i=0 ;i<lenOfEachWord[word];i++){
words[word][i]=Sentence[chr];
chr++;
}
word++;
}
for (int i=0;i<numOfWords;i++){
for (int j=0;j<lenOfEachWord[i];j++){
cout<<words[i][j];
}
cout<<endl;
}
for (int i=0;i<numOfWords;i++){
delete[] words[i];
}
delete[] words;
return 0;
}
答案 0 :(得分:0)
下面:
while (chr<lenOfStr){
for (int i=0 ;i<lenOfEachWord[word];i++){
words[word][i]=Sentence[chr];
chr++;
}
word++;
}
你没有处理拆分器字符,如果Sentence
中的字符数 ,那么循环就会严重失败。
更一般地说,在测试任何代码之前你编写了很多代码,这是一个肯定的错误路径。
答案 1 :(得分:0)
您应该尝试为代码添加日志。我尝试使用这段代码进行测试,并且发现有一些你错过了注意的边界,比如你错过了最后一个字,并且在复制过程中没有排除分割器。但我不确定你确定单词数量的方式是否正确,我认为样本输入应该只有两个单词。
但是我会留给你决定。希望它有所帮助
输入:_test_string _
输出:
numOfWords: 4
lenOfStr: 13
0 4 6 0
0
1
1 0 1 t
1 1 2 e
1 2 3 s
1 3 4 t
2
2 0 6 s
2 1 7 t
2 2 8 r
2 3 9 i
2 4 10 n
2 5 11 g
test
string
#include <iostream>
#include <cstring>
using namespace std;
int main(int argc, char **argv)
{
char Sentence[255];
cin.getline(Sentence,255);
char splitter='_';
int lenOfStr=0;
int numOfWords=1;
while (Sentence[lenOfStr]!='\0'){
if (Sentence[lenOfStr]==splitter) numOfWords++;
lenOfStr++;
}
std::cout <<"numOfWords: " << numOfWords <<std::endl;
std::cout <<"lenOfStr: " << lenOfStr <<std::endl;
char** words=new char* [numOfWords];
int* lenOfEachWord=new int[numOfWords];
int lenth=0,wordNum=0;
for (int i=0;i<lenOfStr;i++){
if (Sentence[i]==splitter) {
lenOfEachWord[wordNum]=lenth;
lenth=0;
wordNum++;
}
else lenth++;
}
// be care with the boundary
if (lenth >= 0)
{
lenOfEachWord[wordNum]=lenth;
wordNum++;
}
for(int i =0 ; i< numOfWords; i++)
{
std::cout << lenOfEachWord[i] << " ";
}
std::cout<<std::endl;
for (int word=0;word<numOfWords;word++){
int lenth=lenOfEachWord[word];
words[word]=new char[lenth];
}
int word=0;
int chr=0;
while (chr<lenOfStr){
if (Sentence[chr] == splitter )
{
chr++;
continue;
}
std::cout << word << endl;
for (int i=0 ;i<lenOfEachWord[word];i++){
words[word][i]=Sentence[chr];
std::cout << word << " " << i << " " << chr<< " "<< Sentence[chr]<<endl;
chr++;
}
word++;
}
for (int i=0;i<numOfWords;i++){
for (int j=0;j<lenOfEachWord[i];j++){
cout<<words[i][j];
}
cout<<endl;
}
for (int i=0;i<numOfWords;i++){
delete[] words[i];
}
delete[] words;
return 0;
}