指针坏了C++; 我正在编写一个用C++编写作业分配的字符串符号化程序,它使用指针。但是,当我运行并调试它时,它会说我的指针pStart无效。我觉得我的问题在于我的参数构造函数,我已经包括了下面的构造函数和对象创建
如果您能告诉我为什么在调试pStart时它会说pStart是一个错误的指针,我将不胜感激 谢谢指针坏了C++; 我正在编写一个用C++编写作业分配的字符串符号化程序,它使用指针。但是,当我运行并调试它时,它会说我的指针pStart无效。我觉得我的问题在于我的参数构造函数,我已经包括了下面的构造函数和对象创建,c++,pointers,tokenize,arrays,C++,Pointers,Tokenize,Arrays,如果您能告诉我为什么在调试pStart时它会说pStart是一个错误的指针,我将不胜感激 谢谢 StringTokenizer::StringTokenizer(char* pArray, char d) { pStart = pArray; delim = d; } // create a tokenizer object, pass in the char array // and a space character for the delimiter StringTokenizer tk
StringTokenizer::StringTokenizer(char* pArray, char d)
{
pStart = pArray;
delim = d;
}
// create a tokenizer object, pass in the char array
// and a space character for the delimiter
StringTokenizer tk( "A test char array", ' ' );
完整stringtokenizer.cpp:
#include "stringtokenizer.h"
#include <iostream>
using namespace std;
StringTokenizer::StringTokenizer(void)
{
pStart = NULL;
delim = 'n';
}
StringTokenizer::StringTokenizer(const char* pArray, char d)
{
pStart = pArray;
delim = d;
}
char* StringTokenizer::Next(void)
{
char* pNextWord = NULL;
while (pStart != NULL)
{
if (*pStart == delim)
{
*pStart = '\0';
pStart++;
pNextWord = pStart;
return pNextWord;
}
else
{
pStart++;
}
}
return pNextWord;
}
完整main.cpp:
const int CHAR_ARRAY_CAPACITY = 128;
const int CHAR_ARRAY_CAPCITY_MINUS_ONE = 127;
// create a place to hold the user's input
// and a char pointer to use with the next( ) function
char words[CHAR_ARRAY_CAPACITY];
char* nextWord;
cout << "\nString Tokenizer Project";
cout << "\nyour name\n\n";
cout << "Enter in a short string of words:";
cin.getline ( words, CHAR_ARRAY_CAPCITY_MINUS_ONE );
// create a tokenizer object, pass in the char array
// and a space character for the delimiter
StringTokenizer tk( words, ' ' );
// this loop will display the tokens
while ( ( nextWord = tk.Next ( ) ) != NULL )
{
cout << nextWord << endl;
}
system("PAUSE");
return 0;
const int CHAR\u ARRAY\u容量=128;
常数int字符数组容量负一=127;
//创建一个存放用户输入的位置
//以及与next()函数一起使用的char指针
字符字[字符数组容量];
char*nextWord;
不能改变
到
字符串文字总是const char * const变量,由于C++自动将非const转换为const,所以它不能将const转换为非const。
您也可以创建不同的构造函数,但我认为您不需要它,只要您只读取pArray字符串
您可以使用以下内容:
TokenList& StringTokenizer::StringTokenizer(const char* pArray, char d){
TokenList lst();
size_t i=0;
char buffer[100]; //hardcoded limit, just an example, you should make it grow dinamically, or just use a std::string
while((*pArray)){
if(*pArray == d){
buffer[i] = 0; //string ending character, 0 = '\0';
lst.add(buffer);
i=0;
}
pArray++;
}
//Last token in the input string won't be ended by the separator, but with a '\0'.
buffer[i] = 0;
lst.add(buffer);
return lst;
}
你不能在你的记录器中修改<代码> pStuts/Co>,因为C和C++中的文字字符串是不可修改的,它有一个类型<代码> const char */COD>。当你做作业的时候
pStart = pArray;
在构造函数中,pStart
现在指向一个不可修改的内存。这很可能是你的问题。如果不是这样的话,你需要发布更多的代码
编辑:查看编辑后,看起来您已将代码更改为使用数组。那很好。我没有详细查看您的代码,但至少有一个错误:
while (pStart != NULL)
应该是:
while (pStart != NULL && *pStart)
这是因为当您点击字符串中的终止'\0'
时,希望停止循环
<>我不知道为什么你在C++中使用C风格字符串。这是您作业中的一项要求吗?将StringTokenizer类中的pStart从char*更改为const char*,并对构造函数进行相同的更改。在我看来,您应该更改StringTokenizer的构造函数和析构函数:
StringTokenizer::StringTokenizer(char* pArray, char d)
{
pStart = str = strdup( pArray );
delim = d;
}
StringTokenizer::~StringTokenizer(char* pArray, char d)
{
free( str );
}
现在,您可以按照使用pStart的方式使用它:修改字符串,将零放入以标记单词,等等。您只需要向StringTokenizer添加一个“char*str”私有属性
这里的诀窍是,您正在创建自己的字符串副本,因此,只要在析构函数中释放它,您就可以任意操作它。唯一的缺点是存储副本需要内存(因此每个字符串需要两倍的内存)
您的解决方案不起作用的原因是,文字是或可以存储在只读内存中,因此它们被正确标记为const char*,无法写入它们。您收到的错误消息是什么?CXX0030:错误:无法计算表达式
谢谢!CXX003是一个C/C++运行时/编译时错误,但只是在调试器中出现的一个错误,表明您误用了值计算器-如果您可以发送更完整的代码,那就更好了。您粘贴的位在此表单中不完整且不正确,即pStart是什么?请发布实际代码和实际错误消息。“表达式无法计算”的编译时错误与您报告的“调试时pStart是一个坏指针”的问题完全不同。但现在我得到:错误C2440:“=”:无法从“const char*”转换为“char*”
请为它们添加更多信息。你看,字符串文字是常量,你不能以任何方式改变它。我想你实际上是在把它分配给另一个字符*,你不能,你必须把它分配给另一个常量字符*。我将编辑答案,向您展示一些我正在思考的实际代码。如果我使用char数组,它会改变什么吗?char数组在哪里?如果<>代码> pStuts是char数组,赋值甚至不编译:不能在C++中分配数组。请发布最小完整代码。谢谢!项目上的主要帮助!
while (pStart != NULL)
while (pStart != NULL && *pStart)
StringTokenizer::StringTokenizer(char* pArray, char d)
{
pStart = str = strdup( pArray );
delim = d;
}
StringTokenizer::~StringTokenizer(char* pArray, char d)
{
free( str );
}