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

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 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划