读取字符串C ++的字符时出错

时间:2017-01-05 09:57:13

标签: c++ null

我展示了我的代码,我读错了字符串字符。在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;                           

    }

2 个答案:

答案 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,然后才能正常工作。