C hex到dec转换,我不明白我的代码有什么问题

时间:2016-08-19 14:19:38

标签: c

我的代码应该在用户输入中找到十六进制数字(跟随或不是0x),将它们作为字符串复制到数组中,并且每次找到非1-9 af AF字符或EOF时,它应该执行htoi函数将字符串中的字符转换为十进制数,从右到左进行,并使用乘数来计算位置。它没有做它应该做的事情。它生成的数字与我的十六进制数的十进制等值无关。

#include <stdio.h>
#include  <string.h>
#include  <math.h>

int htoi(char num[]);

int main()
{
    int c,i = 0;
    char num[1000];
    while ((c = getchar()) != EOF)
    {
        if ((c > '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'a' && c <= 'f'))
        {
            num[i] = c;
            i++;
        }
        else if (c == '0')
        {
            if ((c = getchar) == 'x' || c == 'X')
            {
                num[i] = '\0';
                printf("%d", htoi(num));
                i=0;
            }
            else
            { 
                 num[i] = c;
                 i++;
            }
        }
        else
        {
            num[i] = '\0';
            if (num[0] != '\0')
            {
                printf("%d", htoi(num));
            }
            i=0;
        }


    }
num[i] = '\0';
if (num[0] != '\0')
    {
          printf("%d", htoi(num));
    }
i=0;
return 0;
}

int htoi(char num[])
{
    int c,i, dig;
    int  dec;
    int multiplier = 1;

    for (i = strlen(num)-1; i >= 0; i--)
    {
        c = num[i];
        if (c > '0' && c <= '9')
        {
            dig = c - '0';
        }
        else if (c > 'a' && c <= 'f')
        {
            dig = c - 'a' + 10;
        }
        else if (c > 'A' && c <= 'F')
        {
            dig = c - 'A' + 10;
        }
        dec = dec + dig * multiplier;
        multiplier * 16;
        return dec;
    }
}

1 个答案:

答案 0 :(得分:0)

三个问题:

  1. #include <condition_variable> #include <mutex> #include <chrono> #include <future> #include <functional> void fire_cv( std::mutex *mx, std::condition_variable *cv ) { std::unique_lock<std::mutex> lock(*mx); printf("firing cv\n"); cv->notify_one(); } int main(int argc, char *argv[]) { std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); std::condition_variable test_cv; std::mutex test_mutex; std::future<void> s; { std::unique_lock<std::mutex> lock(test_mutex); s = std::async(std::launch::async, std::bind(fire_cv, &test_mutex, &test_cv)); printf("blocking on cv\n"); std::cv_status result = test_cv.wait_until( lock, std::chrono::steady_clock::time_point::max() ); //std::cv_status result = test_cv.wait_until( lock, now + std::chrono::hours(1) ); // <--- this works as expected! printf("%s\n", (result==std::cv_status::timeout) ? "timeout" : "no timeout"); } s.wait(); return 0; } 只是扔掉了结果。你想要multiplier * 16;

  2. multiplier *= 16使用当前值return dec立即返回 。你应该在循环之后有

  3. 变量dec 未初始化,这意味着它将具有不确定的值。像您一样使用它而不进行初始化将导致未定义的行为

  4. 还有其他问题,其中一些问题会被编译器捕获,导致错误或警告。以上三点就是我在快速浏览后发现的。