2017-02-16 33 views
-2

我需要在一个声明无符号的字符指针里面有什么偷看,我减少了我的问题,这个简单的例子COUT derefernced(无符号字符)的指针,让我意想不到的效果

#include<iostream> 
int main (int argc, char *argv[]) 
{ 
    unsigned char * buffer = new unsigned char; 
    *buffer = 8; 
    std::cout << "buffer = " << (unsigned char) (*buffer) << std::endl; 
} 

我期待这个输出:缓冲区= 8

,但我得到 缓冲=

空白,这驱使我坚果,甚至没有任何价值!

如何我其实和它打交道:

#include<iostream> 
typedef unsigned char uint8_t; 
int main (int argc, char *argv[]) 
{ 
    uint8_t * buffer = new uint8_t ; 
    *buffer = 8; 
    std::cout << "buffer = " << (int) (*buffer) << std::endl; 
} 

我使用NS3这个例子中,缓冲构建了一个字节的有效载荷数据包,而我需要它是一个指针。 这就是为什么我实际上将我的问题与“C++”一起标记为“C”,因为问题的核心也在C中担心。但是我发现自己被拒绝投票支持!我知道“cout”和“new”是C++文字,但它与问题无关!

由于没有与所有的编码问题,我的问题就是什么是无符号的字符那么,如果它的内容与COUT一个普通字符!!!!!

我说我期待它是buffer = 8,因为无符号字符是一个字节的整数。

谢谢你们,因为你让我注意到cout正在处理它,就好像它是一个普通的字符,尽管它对我来说是预期的。

+1

8是第8个字符,而不是字符8 – TemplateRex

+0

@mahmoud你不是'无符号字符'指针。修正标题。 – LogicStuff

+0

@LogicStuff:是的。 '* buffer'是一个'unsigned char','unsigned char'(* buffer)'绝对是一个'unsigned char'。 –

回答

1

'8'是字符8. 8只是一个不可见的字符的代码。

尝试编写*buffer = 48;并根据此table推测为什么输出为“缓冲区= 0”。

+0

或可能是一个退格:http://www.asciitable.com/ – doctorlove

+0

如何建议代码是清楚的人类?没有神奇数字 – StoryTeller

+0

@doctorlove。绝对是一个退格。我不记得我的ASCII代码。 – riodoro1

3

如果我们稍微延长你的例子是:

int main(int argc, char *argv[]) { 
    unsigned char * buffer = new unsigned char; 
    *buffer = 8; 
    std::cout << "buffer = [" << (*buffer) << "]\n"; 
} 

输出

buffer = ] 

更多的ASCII字符8表示退格,它已核爆开幕[。 注意你不需要转换为无符号字符 - *buffer是一个无符号字符。

如果你想要它有字符'8'你需要将它的内容设置为8. 不要忘记deletenew什么。

int main(int argc, char *argv[]) { 
    unsigned char * buffer = new unsigned char; 
    *buffer = '8'; //<---- see the single quotes? 
    std::cout << "buffer = [" << (*buffer) << "]\n"; 
    delete buffer; 
} 

与输出

buffer = [8] 

当然,我们并不真正需要这些指针:

int main(int argc, char *argv[]) { 
    unsigned char buffer = '8'; 
    std::cout << "buffer = [" << buffer << "]\n"; 
} 

如果你坚持使用原始字符代码:

int main(int argc, char *argv[]) { 
    unsigned char buffer = 56; 
    std::cout << "buffer = [" << buffer << "]\n"; 
} 

编辑:

如果你想知道什么是什么数值是在buffer变量,因此要<<报告的整数值,而不是流为一个字符,使用强制。

int main(int argc, char *argv[]) { 
    unsigned char buffer = 56; 
    std::cout << "buffer = [" <<static_cast<unsigned int>(buffer) << "]\n"; 
} 
0

发现这个刚才无符号()

#include<iostream> 
int main (int argc, char *argv[]) 
{ 
    unsigned char * buffer = new unsigned char; 
    *buffer = 8; 
    std::cout << "buffer = " << unsigned(*buffer) << std::endl; 
} 

它给了我在我的问题想输出buffer = 8 这是不buffer = '8'因为有些人可能认为我的意思

+0

这是一个C风格转换为'unsigned int'(由于历史原因,名称的int部分是可选的)。 –