输入存储到字符串,然后逐一判断,删除不合法的字符即可。
一、算法分析:
1、输入字符串。
2、逐一判断是否合法,如果不合法,则删除。删除方法可以使用后续字符覆盖当前字符。
3、可以从前向后遍历,每一个不合法字符都被后续合法字符覆盖,这样一次循环即可完成所有操作。
二、参考代码:
#include
int main()
{
char s[100];
char *p, *q;
gets(s);//输入字符串。
for(p=q=s;*p!='\0'; p++)//以p指针遍历字符串。
if((*p>='0' && *p<='9') || (*p>='a' && *p<='f')||(*p>='A' && *p<='F'))//合法16进制字符。
*q++=*p;//赋值到对应位置。 只有合法的才赋值,这样非法的就会被覆盖。
*q='\0';//添加新的字符串结束符。
printf("%s\n", s);//输出结果。
return 0;
}
额,这个嘛,上面的那个j++;应该和b[j]=a[i];用一个大括号括起来,if后面不接大括号就默认一个分号和这个if有效,虽然有时候就一句话,但是还是养成写大括号的习惯比较好,一来直观,二来有时候添个一句话的时候很好用。
下面的if循环,你里面有些写的是b[i],怎么会对。给你改了。试试看,复制粘贴可能排版有点乱。勿怪
#include
int main()
{
int i,j=0,end=0;
char a[80],b[80];
printf("Input a string: ");
gets(a);
printf("%s\n", a);
for(i=0;a[i]!='\0';i++)
{
if((a[i]>='a'&&a[i]<='f')||(a[i]>='A'&&a[i]<='F')||(a[i]>='0'&&a[i]<='9'))
{
b[j]=a[i];
j++;
}
}
b[j]='\0';
printf("%s\n",b);
for(j=0;b[j]!='\0';j++)
{
if (b[j]>='0'&&b[j]<='9')
end=end*16+b[j]-'0';
else if(b[j]>='A'&&b[j]<='F')
end=end*16+b[j]-'A'+10;
else if(b[j]>='a'&&b[j]<='f')
end=end*16+b[j]-'a'+10;
}
printf("Hex=%d",end);
return 0;
}
#include
void main()
{
char str[81];
int sum=0,i=0;
gets(str);
while(str[i])
{
if(str[i]>='a' && str[i]<='f')
str[i]-=32;
if(str[i]>='0' && str[i]<='9')
sum=sum*16+str[i]-'0';
if (str[i]>='A' && str[i]<='F')
sum=sum*16+str[i]-'A'+10;
i++;
}
printf("hex=%d\n",sum);
}
#include
void main(){
char s[80];
int i,x;
gets(s);
x=0;
i=0;
while(s[i]){
if (s[i]<='9' && s[i]>='0') x=x*16 + s[i] - '0';
else if (s[i]<='F' && s[i]>='A') x=x*16 + 10 + s[i] - 'A';
else if (s[i]<='f' && s[i]>='a') x=x*16 + 10 + s[i] - 'a';
i++;
}
printf("%d\n",x);
}
程序调试通过,但是输入的数据不要太大哦,例如输入AAAAAA,这样系统内部的int类型装不下,需要自定义大数据类型来表示。