利用指针能直接操作内存的特点来编程输出字符串中每个字符在内存中的存储编码(字符串中可以包含英文数字和汉字)。 程序的运行示例1如下: 请输入一个字符串,长度小于等于100:abcABC012中国人 该字符串的内存编码为: 61 62 63 41 42 43 30 31 32 d6 d0 b9 fa c8 cb 程序的运行示例2如下: 请输入一个字符串,长度小于等于100:12345上山打老虎 该字符串的内存编码为: 31 32 33 34 35 c9 cf c9 bd b4 f2 c0 cf bb a2 提示: 输出格式用"%x "
参考答案
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char str[101] = {'\0'};
char *p1, *p2;
printf("请输入一个字符串,长度小于等于100:");
scanf("%s", str);
p1 = (char *)(str + strlen(str));
p2 = (char *)str;
printf("该字符串的内存编码为: ");
while (p1 > p2)
{
printf("%x ", (unsigned char)*p2 & 0xff);
p2++;
}
return 0;
}
运行结果
个人创作答案
include<stdio.h>
void main()
{
char str[100];
char *pstr=str;
int len=0,i;
printf("请输入一个字符串,长度小于等于100:");
gets(pstr);
for(;*pstr!='\0';pstr++)
{
printf("%x ",(unsigned char)*pstr);//亦可写作 (unsigned char)*pstr &0xff
}
}//CodeBlock正确,但哈工大平台上却有误。
运行结果
然而,研究发现,只要字符型变量值的二进制第一位是1,就会如所显示的那样,出现6个f。
而格式输出函数printf中会对所输出的变量做有符号/无符号型的判断。如果是有符号型变量,且该值二进制首位为1,则会按照补码形式前面全置为1,也就是全为f。如图
出现fffffd6……
所以本题易错一般在于如下
#include<stdio.h>
void main()
{
char str[100];
char *pstr=str;
int len=0,i;
printf("请输入一个字符串,长度小于等于100:");
gets(pstr);
for(;*pstr!='\0';pstr++)
{
printf("%x ",*pstr);//未强转为unsigned类型,故错误
}
}
输出错误结果如下