2011-09-27 78 views
0
Something::methodname() 
{ 
    (unsigned char*) ptr = (unsigned char*) m_pptr; 

    while ((*ptr || *(ptr+1)) && (((unsigned char*)m_pptr+BUFSIZE)<ptr)) 
     ptr++; 

    if(ptr == m_pptr) 
     return ptr; 

    return ptr + 1; 
} 

m_pptr是受保护的类的成员。 ptr是本地功能帮助C++逻辑?

有人可以帮我这个代码的逻辑吗?我知道它编译,但我出来的答案不是我期待的答案。我memset缓冲区充满A5的和while循环以某种方式失败。它跳过它。任何帮助都会很棒。

这将经历一个缓冲区,如果指针或(ptr+1)值的值为true,则增加指针和PTR不能超过缓冲区的大小(由m_pptr“指针发现缓冲区的开始“+缓冲区大小)也必须为真。 if语句表示,如果m_pptr(指针到缓冲区的开头是一样的ptr然后只返回指针

这个函数返回一个void*并传递什么

+1

我想你在那里有一个流浪的花括号 –

+2

你还没有真正说过你期待的代码是什么...... – Neil

+1

而且我非常肯定它不能编译。 – littleadv

回答

4
(((unsigned char*)m_pptr+BUFSIZE)<ptr)) 

看起来落后。

(((unsigned char*)m_pptr+BUFSIZE)>ptr)) 

会更容易,更理智:

while (ptr < ((unsigned char*) m_pptr + BUFSIZE)) // until end of buffer 
{ 
    if (!*ptr)  // null char reached 
     break; 
    if (!*(ptr+1)) // null char almost reached 
     break; 

    // do stuff 

    ptr++; 
} 
+0

这是一个入门机制。有人输入文字,然后是空指针。更多文本空指针。等等,直到双空,没有更多的条目可用。 while循环检查指针的值是否为真(任何数字为零)或其后的值为真或(任何数字为零),并且ptr不能大于缓冲区大小 – Questioneer

2

该位看起来可疑对我说:

while ((*ptr || *(ptr+1)) 

试想一下,PTR指向一个有效的字符字节,后跟一个NUL终止字节。

上述行的第一个子测试将评估为true,因此ptr得到增加。现在ptr指向NUL终止符字节,并且*(ptr + 1)指向NUL终止符字节之后的字节......这可能是垃圾/未定义的,因此可能不为零,此时(ptr )会再次递增(因为这次第二个子测试评估为真),所以现在ptr指向NUL终止字节后面的字节。然后从你的指针前往la-la-land,尝试解释那些本来不属于它解析的字符串的数据。

1

如果您使用for-loop来代替它会不会看起来更干净和更简单?

for (int i =0; i<BUFSIZE && (ptr[i] || ptr[i+1]); i++); 

这会更容易发现错误的比较,不是吗? ,我认为这也将是比较容易看到,在这种情况下,它应该是

for (int i =0; i<(BUFSIZE-1) && (ptr[i] || ptr[i+1]); i++); 

甚至

for (int i =1; i<BUFSIZE && (ptr[i-1] || ptr[i]); i++); 

除非obiviously你占的是具有BUFSIZE等于缓冲区大小减一。