从字母转换为二进制到十进制,最后转换为char

时间:2017-06-29 04:55:19

标签: c

所以我有这个代码获取用户输入,char by char(不使用char数组),应该发生的是每7个字母对应一个字母,7个字母中的每个字母都是1或0,取决于该字母的ascii值是偶数还是奇数(即使为0,奇数为1)。
例如:" GCJLLBI" =" 1100001",转换为decimal = 97,这是' a'的ascii代码。

因此,如果用户输入" GCJLLBI"然后程序需要将其转换为二进制,然后转换为十进制,然后使用%c和十进制值打印 不能使用数组我试图只使用原语,没有抽象数据类型或数组。 这是我到目前为止的代码:

/** given a binary number, convert to decimal. */
int binToDec(int binary) 
{
    int decimal = 0, i = 1, remainder;

    /* Iterate until number becomes zero */
    while (binary != 0)
    {
        remainder = binary % 10;
        decimal = decimal + remainder * i;
        i = i * 2;
        binary = binary / 10;
    }

    return decimal;
}

/* Decodes text.*/
int decode(void) {
    char ch;
    printf("? ");
    discardToEOL(); /*Discards any newlines from previous. */
    /*Get Input */
    do {
        scanf("%c", &ch);
    if (ch >= 0 && ch <= 128 && ch != 10) {
        //Send each char to get converted 
        //to binary and then convert binary to ddecimal, 
        //then display as char.

    }
    } while(ch != '\n');
    printf("\n");   
}

所以我真的需要帮助并且不明白,如果用户输入21个字符,那些是由char输入char而不是数组,我该如何解析那些成组7,然后根据它们的偶数或奇数值将它们转换为二进制?

2 个答案:

答案 0 :(得分:0)

你只需添加某种计数器和累加器(总和)。这里的问题是pow()。因为它接受双倍。您也可以制作自己的pow函数,它接受整数并将它们相乘多次。 (对不起,我的答案,stackoverflow中的第一个答案)

int count = 0; //add a counter here
int sum = 0;
do {
    scanf("%c", &ch);
if (ch >= 0 && ch <= 128 && ch != 10) {
    //Send each char to get converted 
    //to binary and then convert binary to ddecimal, 

    sum += pow(2,count) * convertedBinaryNumber;
    //convertedBinaryNumber either 1 or 0

    count++;
    if(count == 7){
         count == 0;
         //print sum here to ascii
         sum = 0;
    }

    }
} while(ch != '\n');

答案 1 :(得分:0)

您可以从输入流中一次读取一个字符,并保持当前字符值的运行记录。

下面的代码首先将value初始化为64,如果输入字符的值为奇数,则将其添加到当前打印字符的总值。然后value减少,循环继续。当value达到零时,将打印与上一组输入字符关联的当前打印字符,并重置valuecur_sum。循环继续,直到到达换行符或文件结尾。循环退出后,应该剩下一个字符要打印(与\n之前的输入相关联的字符)。如果value此时非零,则输入字符数不是7的倍数,并打印错误消息;否则打印最后一个字符。

#include <stdio.h>

int main(void)
{
    int c;
    int value = 64;
    int cur_sum = 0;

    while ((c = getchar()) != '\n' && c != EOF) {
        if (value == 0) {
            putchar(cur_sum);
            value = 64;
            cur_sum = 0;
        }
        cur_sum += (value * (c % 2));
        value /= 2;
    }

    if (value) {
        putchar('\n');
        puts("Input format error");
    } else {
        putchar(cur_sum);
        putchar('\n');
    }

    return 0;
}

示例互动:

GJLIBBLGCJBIBIGCJIIBBGCJIIBBGCJICICJGJLLBBGCIJGCIGCJICICGCIJLIBGCJGCJJGCJLIBBJGLLBBI
Hello world!