C语言题目。。输入一个以回车结束的字符串(少于80 个字符),滤去所有的非十六进制字

2024-11-29 13:51:48
推荐回答(4个)
回答1:

输入存储到字符串,然后逐一判断,删除不合法的字符即可。

一、算法分析:

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;
}

回答2:

额,这个嘛,上面的那个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;
}

回答3:

#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);
}

回答4:

#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类型装不下,需要自定义大数据类型来表示。