这些是我的程序错误。
myString1.cpp: In constructor ‘MyString1::MyString1(char*, int)’:
myString1.cpp:6: error: expected primary-expression before ‘]’ token
myString1.cpp:6: error: expected primary-expression before ‘]’ token
myString1.cpp: In member function ‘MyString1 MyString1::append(MyString1)’:
myString1.cpp:11: error: invalid use of member (did you forget the ‘&’ ?)
myString1.cpp: In member function ‘void MyString1::clear()’:
myString1.cpp:25: error: expected primary-expression before ‘]’ token
myString1.cpp:25: error: expected primary-expression before ‘{’ token
myString1.cpp:25: error: expected `;' before ‘{’ token
myString1.cpp: In member function ‘bool MyString1::empty()’:
myString1.cpp:29: error: expected primary-expression before ‘]’ token
myString1.cpp:31: error: expected primary-expression before ‘else’
myString1.cpp:31: error: expected `;' before ‘else’
以下是我在三个不同部分的计划。
myString1.h
#ifndef MYSTRING1_H
#define MYSTRING1_H
class MyString1
{
private:
char chars[];
int size;
public:
MyString1();
MyString1(char chars[], int size);
MyString1 append(MyString1 s);
char at(int index);
int length();
void clear();
bool empty();
int find(char ch);
};
#endif
myString1.cpp
#include "myString1.h"
using namespace std;
MyString1::MyString1(char chars[], int size)
{
this->chars[] = chars[];
this->size = size;
}
MyString1 MyString1::append(MyString1 s)
{
for(int i = size; i > size - s.length; i++)
chars[i] = s.at(i);
}
char MyString1::at(int index)
{
return chars[index];
}
int MyString1::length()
{
return size;
}
void MyString1::clear()
{
size = 0;
chars[] = {};
}
bool MyString1::empty()
{
if(chars[]){
return true;
else
return false;
}
}
int MyString1::find(char ch)
{
for(int i = 0; i < size; i++)
if(chars[i] = ch)
return i;
}
testMyString1.cpp
#include <iostream>
#include "myString1.h"
using namespace std;
int main()
{
MyString1 first("cat", 4);
MyString1 second("dog", 4);
cout << first.at(1) << " and " << second.at(1) << endl;
first.append(second);
cout << first.at(6) << endl;
return 0;
}
我是一个新手,只是想学习如何使用g ++编译器,所以只是寻找帮助阅读错误消息和调试我的代码。此外,我确信有一些非常糟糕的代码,所以任何帮助都表示赞赏。
答案 0 :(得分:4)
代码有很多错误,所以我不知道从哪里开始,但我想通常会给你一些指导来帮助你理解你的代码是好的。
在我看来,你不需要在String类中有一个大小索引,因为strlen()函数很乐意为你计算它。 现在为您的类声明检查如何声明将为您保存字符串的指针。你需要这样做:
class MyString1
{
private:
char* chars;//this declares a pointer to a char that will hold the string for you
public:
...
此外,您永远不会分配包含字符串的char *。你的构造函数应该是:
MyString1::MyString1(const char* chars)
{
this->chars = (char*) malloc(strlen(chars)+1); //this will allocate an array of strlen() chars +1
strcpy(this->chars,chars);
}
正如您所看到的,我没有使用大小索引,因为strlen可以非常有效地为您找到它。 +1代表'\ 0',表示字符串的结尾。
现在要在字符串上添加一些东西,这会很棘手。
void MyString1::append(const MyString1& s) //it's good to give a constant reference to the string here
{
//first of all we gotta reallocate the pointer,since we don't have enough memory for the string
int newsize = strlen(this->chars) + strlen(s)+1;
this->chars = (char*) realloc(this->chars,newSize); \\ no check for realloc failure, I know but this is just an example
strcat(this->chars,s.chars);
}
附加时不需要返回任何内容。你正在为这个字符串做些什么。
你的:: at()函数几乎没问题。想象一下,如果字符串的大小是10并且你请求MyString1 :: at(12)会发生什么。这可能会导致分段错误(这不好)。
因此,您应该更改代码以执行如下所示的边界检查:
char MyString1::at(int index)
{
//if it's out of bounds let's return -1 which will signify that we got an out of bounds value (could also throw an exception here but that's a different subject altogether)
if(index > strlen(this->chars) || index <0)
return -1;
return chars[index];
}
同样在C / C ++中,你必须释放你分配的内存。所以为了做到这一点,你应该声明一个叫做析构函数
的东西MyString1::~MyString1()
{
free(this->chars);
}
最后是空函数就可以这样:
bool MyString1::empty()
{
return (this->chars[0] == '\0';
}