我展示了我的代码,在读取字符串字符时出错。在NULL
之前,我的调试器中一切正常。
*Warning C4715 `String::equas`: not all control paths return a value*
我不能使用它,因为我正在为参数使用NULL
指针。
我该如何解决这个问题?
非常感谢,祝你今天愉快!
标题:
class String
{
public:
String();
bool empty();
String(char * other_str);
bool equals(const String other_str);
private:
char* m_str;
};
我的代码:
#include "String.hpp"
#include <string>
#include<iostream>
int my_len(const char* p) {
int c = 0;
while (*p != ' ')
{
c++;
*p++;
}
return c;
}
String::String()
:m_str(NULL)
{
}
String::String(char * other_str)
{
}
bool String::empty()
{
return true;
}
bool String::equals(const String other_str)
{
if (m_str == NULL && other_str.m_str == NULL) {
return true;
}
if (m_str == NULL && other_str.m_str != NULL) {
return false;
}
if (m_str != NULL && other_str.m_str == NULL) {
return false;
}
if (m_str != NULL && other_str.m_str != NULL) {
int mystrlen = my_len(m_str);
int myrhslen = my_len(other_str.m_str);
if (mystrlen != myrhslen)
{
return false;
}
else
{
for (int i = 0; i < mystrlen; i++)
{
if (m_str[i] != other_str.m_str[i])
{
return false;
}
else {
return true;
}
}
}
}
}
我将添加以下代码:
int mylen(const char* p) {
int c = 0;
while (*p != ' ')
{
c++;
*p++;
}
return c;
}
void my_cpy(char dest, const char* src) {
int i = 0;
while (src[i] != ' ') {
dest[i] = src[i];
i++;
}
dest[i] = ' ';
}
char mytrdup(const char *s) {
char* d = (char*)malloc((my_len(s) + 1) * sizeof(char));
if (d == NULL) {
return NULL;
}
else{
my_cpy(d, s);
}
return d;
}
String empty_string2(NULL);
这将调用构造函数版本:
String::String(char* other_str) {}
它什么都不做,使m_str
指针悬空/未初始化。您应该以某种方式更改此构造函数,方法是复制字符串并相应地设置m_str
指针,或者将m_str
设置为与参数相同的地址。无论哪种情况,都取决于你想要实现什么。
此外,您的代码中还存在许多其他问题。我注意到您中已经实现了函数my_len
。您应该将*p++
更改为p++
。我想知道这是如何通过编译btw的,因为参数是const char*
。
最后,编译器的警告是正确且非常清楚的,尽管并不是您目前面临问题的根源。
EDIT:要复制字符串,可以这样编写构造函数:
String::String(const char* other_str)
{ m_str = (other_str ? strdup(other_str) : other_str); }
此外,最好在代码中使用null_ptr
而不是NULL
。自C++11以来,这是空指针的标准。
我添加了TEST_TRUE,然后它就正常工作了。