Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指针坏了C++; 我正在编写一个用C++编写作业分配的字符串符号化程序,它使用指针。但是,当我运行并调试它时,它会说我的指针pStart无效。我觉得我的问题在于我的参数构造函数,我已经包括了下面的构造函数和对象创建_C++_Pointers_Tokenize_Arrays - Fatal编程技术网

指针坏了C++; 我正在编写一个用C++编写作业分配的字符串符号化程序,它使用指针。但是,当我运行并调试它时,它会说我的指针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

如果您能告诉我为什么在调试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( "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 );
}