果冻木鱼 2018-10-27 11:17 采纳率: 0%
浏览 4624

C语言 显示字符串中的字符无效,调试了也不清楚哪儿的问题

 #include<stdio.h>

#define MAX 20//定义最大长度

//测试函数htoi
int htoi(char s[]);

int main()
{
    int i = 0;
    int n;
    int c;
    char s[MAX];

    while ((c = getchar()) != EOF && c != '\n')
    {
        s[i] = c;
        ++i;
    }
    i++;
    s[i] = '\0';
    n = htoi(s);
    printf("%d", n);
}

/*
将16进制转换成10进制,注意字符串开头可能有0x或0X
暂时假定全为有效值吧,不然都不叫数了
*/
int htoi(char s[])
{
    int i;
    int n = 0;//要输出的整形值
    int state;//判断字符是否为16进制

    state = 1;//默认字符是十六进制
    i = 0;
    if (s[i] == '0')
    {
        i++;
        if (s[i] == 'x' || s[i] == 'X')
            i++;
    }
    while (s[i] != '\0'&&state != 0);
    {
        if (s[i] >= '0'&&s[i] <= '9')
        {
            n = n + s[i] - '\0';
            i++;
        }
        else if (s[i] >= 'a'&&s[i] <= 'f')
        {
            n = n + s[i] - 'a' + 10;
            i++;
        }
        else if (s[i] >= 'A'&&s[i] <= 'F')
        {
            n = n + s[i] - 'A' + 10;
            i++;
        }
        else
            state = 0;
    }
    if (state == 1)
        return n;
    else
        return -1;
}
  • 写回答

4条回答

  • Italink 2018-10-27 11:44
    关注

    楼主确定这样做可以将16进制转化为十进制吗?
    ERROR 1:
    main函数中输入字符串结尾加\0的位置有问题,i不需要+1了

     while ((c = getchar()) != EOF && c != '\n')
        {
            s[i] = c;
            ++i;
        }
        s[i] = '\0';
    

    ERROR 2:
    htoi函数中的while后面的分号去掉

    while (s[i] != '\0'&&state != 0)
    

    ERROR 3:
    减去字符'0' 而不是'\0'

     if (s[i] >= '0'&&s[i] <= '9')
            {
                n = n + s[i] - '0';
                i++;
            }
    

    要想转化进制,每次添加一位乘以16

     int htoi(char s[])
    {
        int i;
        int n = 0;//要输出的整形值
        int state;//判断字符是否为16进制
        state = 1;//默认字符是十六进制
        i = 0;
        if (s[i] == '0')
        {
            i++;
            if (s[i] == 'x' || s[i] == 'X')
                i++;
        }
        while (s[i] != '\0'&&state != 0)
        {
            if (s[i] >= '0'&&s[i] <= '9')
            {
                n = n*16 + s[i] - '0';
            }
            else if (s[i] >= 'a'&&s[i] <= 'f')
            {
                n = n*16 + s[i] - 'a' + 10;
            }
            else if (s[i] >= 'A'&&s[i] <= 'F')
            {
                n = n*16 + s[i] - 'A' + 10;
            }
            else
                state = 0;
            i++;
        }
        if (state == 1)
            return n;
        else
            return -1;
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?