【求助】C/C++ 关于unsigned char 的十六进制赋值输入输出的问题
#include<iostream>
using namespace std;
int main()
{
int i;
unsigned char *butter = new unsigned char[65];
for(i=1;i<=64;i++)
{
butter[i]=0xff;
}
for(i=1;i<=64;i++)
{
printf("%.2x ",butter[i]);
if(i%4==0)cout<<" ";
if(i%16==0)cout<<endl;
}
cout<<"输入四个十六进制的数,每输入一个按回车结束,例: A1 回车"<<endl;
for(i=1;i<=4;i++)
{
scanf("%x",&butter[i]);
}
cout<<endl<<endl;
for(i=1;i<=64;i++)
{
printf("%.2x ",butter[i]);
if(i%4==0)cout<<" ";
if(i%16==0)cout<<endl;
}
cout<<endl;
cout<<"不知道为什么会出现第一行的第二大列的数值前面几个变成零了。"<<endl;
cout<<"有没有解决的方法啊?最好C和C++的方法分别列出来,谢谢"<<endl;
}
[解决办法]
直接scanf的"%x"得到的数据位数要长于unsigned char,所以后面的存储单元被覆盖了,通过一个变量自动截断即可~
- C/C++ code
#include<iostream>using namespace std;int main(){int i;unsigned int uc;unsigned char *butter = new unsigned char[65];for(i=1;i<=64;i++){ butter[i]=0xff;}for(i=1;i<=64;i++){ printf("%.2x ",butter[i]); if(i%4==0)cout<<" "; if(i%16==0)cout<<endl; }cout<<"输入四个十六进制的数,每输入一个按回车结束,例: A1 回车"<<endl; for(i=1;i<=4;i++){ scanf("%x",&uc); butter[i] = uc;}cout<<endl<<endl;for(i=1;i<=64;i++){ printf("%.2x ",butter[i]); if(i%4==0)cout<<" "; if(i%16==0)cout<<endl; }cout<<endl; cout<<"不知道为什么会出现第一行的第二大列的数值前面几个变成零了。"<<endl;cout<<"有没有解决的方法啊?最好C和C++的方法分别列出来,谢谢"<<endl; }
[解决办法]
同意楼上。格式符”%%x“意味着,后面的变量为整型变量的地址(4字节),在执行完scanf后,其地址执行的4个字节将被改写。引入一个整型的中间变量即可。
将
- C/C++ code
for(i=1;i<=4;i++){ scanf("%x",&butter[i]);}