我展示了我的代码,我读错了字符串字符。在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 != '\0')
{
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 != '\0')
{
c++;
*p++;
}
return c;
}
void my_cpy(char dest, const char* src) {
int i = 0;
while (src[i] != '\0') {
dest[i] = src[i];
i++;
}
dest[i] = '\0';
}
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;
}
答案 0 :(得分:1)
String empty_string2(NULL);
这将调用构造函数版本:
String::String(char* other_str) {}
什么都不做,让m_str
指针悬空/未初始化。您应该以某种方式更改此构造函数,方法是复制字符串并相应地设置m_str
指针,或者将m_str
设置为与参数相同的地址。无论哪种情况,都取决于你想要达到的目标。
此外,您的代码中还存在许多其他问题。我已经注意到你已经实现了函数my_len
。您应该将*p++
更改为p++
。我想知道这是如何通过编译btw的,因为参数是const char*
。
最后,编译器的警告是正确且非常清楚的,尽管它不暂时是所面临的问题的根源。
编辑:要创建字符串的副本,您可以像这样编写构造函数:
String::String(const char* other_str)
{ m_str = (other_str ? strdup(other_str) : other_str); }
此外,最好在代码中使用null_ptr
代替NULL
。从C ++ 11开始,这是 空指针的标准。
答案 1 :(得分:0)
我添加了TEST_TRUE,然后才能正常工作。