首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strlen()不工作

strlen()不工作
EN

Stack Overflow用户
提问于 2010-06-30 07:04:05
回答 4查看 1.6K关注 0票数 0

基本上,我将一个指向字符串的指针传递给我的构造函数,该构造函数在传递字符串值时初始化其基本构造函数。由于某些原因,strlen()不起作用,所以它没有进入正确的if语句。我已经检查过了,以确保变量中有一个值,并且确实存在。

这是我的代码,我去掉了所有不相关的部分:

标签分类内容:

代码语言:javascript
复制
Label(int row, int column, const char *s, int length = 0) : LField(row, column, length, s, false)
{
}

Label (const Label &obj) : LField(obj)\
{
}

~Label()
{
}

Field *clone() const
{
    return new Label(*this);
}

LField类内容:

代码语言:javascript
复制
LField(int rowNumVal, int colNumVal, int widthVal, const char *valVal = "", bool canEditVal = true)
{ 
    if(strlen(valVal) > 0)
    {
    }
    else
    {
        //This is where it jumps to, even though the value in
        //valVal is 'SFields:'
        val = NULL;
    }
}

Field *clone() const
{
    return new LField(*this);
}

LField(const LField &clone) { 
    delete[] val;
    val = new char[strlen(clone.val) + 1]; 
    strcpy(val, clone.val);
    rowNum = clone.rowNum;
    colNum = clone.colNum;
    width = clone.width;
    canEdit = clone.canEdit;
    index = clone.index;
}

Screen类内容:

代码语言:javascript
复制
class Screen {
    Field *fields[50];
    int numOfFields;
    int currentField;
public:
    Screen()
    {
        numOfFields = 0;
        currentField = 0;
        for(int i = 0; i < 50; i++)
        fields[i] = NULL;
    }


    ~Screen()
    { 
        for (int i = 0; i < 50; i++)
            delete[] fields[i]; 
    }

    int add(const Field &obj)
    {
        int returnVal = 0;
        if (currentField < 50)
        {
            delete[] fields[currentField];
            fields[currentField] = obj.clone();   
            numOfFields += 1;   
            currentField += 1;      
            returnVal = numOfFields;    
        }
        return returnVal;
    }

    Screen& operator+=(const Field &obj)
    {
        int temp = 0;
        temp = add(obj);
        return *this;
    }
};

Main:

代码语言:javascript
复制
int main () {
    Screen s1;
    s1 += Label(3, 3, "SFields:");
}

希望有人能发现我是否做错了什么。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-30 07:29:42

Marcin在这一点上,问题将归结为调试,我复制了你的代码,但有一些小的遗漏,并得到了正确的结果。

现在需要说明的是,您应该使用更多的C++惯用代码。例如,您应该使用std::string而不是const char*,使用std::vector而不是原始数组。

下面是一个使用std::string的LField构造函数的示例

代码语言:javascript
复制
#include <string> // header for string

  LField(int rowNumVal, 
         int colNumVal, 
         int widthVal, 
         const std::string& valVal = "", 
         bool canEditVal = true)
  {
    std::cout << valVal;
      if(valVal.length() > 0)
      {
      }
      else
      {
          //This is where it jumps to, even though the value in
          //valVal is 'SFields:'
          //val = NULL;
      }
  }

使用这些类型会让你的生活变得更容易,如果你做了改变,它可能也会解决你的问题。

PREVIOUS:这样您就可以确定字符串没有被正确传递,在strlen调用之前添加一个printline。完成此操作后,使用打印行进行反向操作,直到找到未设置字符串的位置。这是一种基本的调试技术。

代码语言:javascript
复制
Label(int row, 
            int column, 
            const char *s, 
            int length = 0) : 
                LField(row, column, length, s, false) {
  }

    LField(int rowNumVal, 
                     int colNumVal, 
                     int widthVal, 
                     const char *valVal = "", 
                     bool canEditVal = true) 
        { 
            std::cout << valVal << std::endl;
            if(strlen(valVal) > 0) 
            {

            }
            else {
                            //This is where it jumps to, even though the value in
                                                                    //valVal is 'SFields:'
                val = NULL;
            }
        }
票数 2
EN

Stack Overflow用户

发布于 2010-06-30 07:12:33

!..不,它不是。

在测量字符串之前,编写一个puts(valVal),以确保您不会错误地理解该变量的内容。

票数 3
EN

Stack Overflow用户

发布于 2010-06-30 08:54:50

每当出现这种奇怪的行为时,内存的混乱几乎总是罪魁祸首。切勿将新与delete[]new[]与混合使用。后者比前者稍差一些,但它们都是坏消息。delete[]只能与new[]一起使用。混合这些分配/释放符号将导致未定义的行为。由于您从未使用过new[],因此请将所有delete[]调用替换为delete。在删除指针后,将指针设置为也是一种良好的做法和良好的礼仪。你不太可能是唯一一个调试这段代码的人,而且调试你的指针时认为那里有有效的内存是非常恼人的,而实际上并没有。

混合这些notations必然会导致exploitsmemory leaks

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3145399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档