无冗余的输入一个字符串
1)输出该字符串
2)对于不是首次出现的字符,对其进行过滤,例如 abcdacdef,过滤后为 abcdef
3)对于字符 0-9,A-F,a-f,将其对应的 ASCII 码的低 4 位进行对调,例如将 1011,转 换为 1101,并将对应的 ACSII 码对应的字符输出,若为字母,转换为大写。
难点:第二问中的过滤,开辟两个字符串指针p,q,p存储原始字符串并输出,q存储过滤后的字符串,首先将p的首位字符赋值给q,再在两层for循环中,外层i从1到len-1为被比较层,内层j从0到i-1为比较层,若发现p+j的值==p+i的值,说明p+i处是已经重复了的值,退出循环,并设置标志位为0,此处也要注意的是,需写完整if-else结构,大概是因为其中有break,否则报错;最后再q添加’\0’;整个输出即可;
第三问中,构造ASCII函数,将单个字符转换为ASCII码并对调低四位,这个利用转化为二进制的方法即可,还得重新在转化为10进制,并输出对应的字符,其中int 型对应的字符可直接强制转化char bb=char(b);同时转化为大写,用<ctype.h>中的函数toupper();
代码:
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
using namespace std;
void ASCII(char ch){
int x=int(ch);
int a[8]={0},b=0,i=0;
while(x>0){
a[i]=x%2;
x=x/2;
i++;
}
for(int k=0;k<2;k++){
int temp=a[k];
a[k]=a[3-k];
a[3-k]=temp;
}
int j=0;
for(i=7;i>=0;i--){
cout<<a[i];
b=b+pow(2,i)*a[i];
}
cout<<endl;
char bb=char(b);
if(bb>='a'||bb<='z'){
bb=toupper(bb);
}
cout<<b<<" "<<bb<<endl;
}
int main()
{
char ch;
char *p=(char*)malloc(sizeof(char));
int len1=1;
while((ch=getchar())!='\n'){
p=(char*)realloc(p,sizeof(char)*len1);
*(p+len1-1)=ch;
len1++;
}
*(p+len1)='\0';
cout<<p<<endl;
char *q=(char*)malloc(sizeof(char));
int len2=1;
*(q)=*(p);
int flag=1;
for(int i=1;i<len1;i++){
for(int j=i-1;j>=0;j--){
if(*(p+i)==*(p+j)){
flag=0;
break;
}
else flag=1;
}
if(flag==1){
q=(char*)realloc(q,sizeof(char)*(len2+1));
*(q+len2)=*(p+i);
len2++;
}
}
*(q+len2)='\0';
cout<<q<<endl;
for(int i=0;i<len2;i++){
if(((*(q+i)>='0')&&(*(q+i)<='9'))||((*(q+i)>='a')&&(*(q+i)<='z'))||((*(q+i)>='A')&&(*(q+i)<='Z'))){
ASCII(*(q+i));
}
}
return 0;
}