Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找C中ASCII值之间的映射_C - Fatal编程技术网

查找C中ASCII值之间的映射

查找C中ASCII值之间的映射,c,C,我被这个问题难住了。我想接收一个字符作为输入ex:a并返回h。b将返回p。c将是x。我将使用ASCII表来计算字符之间的位映射。任何帮助都将不胜感激。问题是,对于两个建议的输入文本,使用ASCII代码表来识别输入和输出之间的位映射。因此,我需要查看ASCII表中值的二进制表示形式,并找到一种在所有值中都通用的模式 简言之: input : abcdefghijklmnopqrstuvwxyz output: hpxaiqybjrzcksf{dlt|emu}gfnv 这是代码的框架: #incl

我被这个问题难住了。我想接收一个字符作为输入ex:a并返回h。b将返回p。c将是x。我将使用ASCII表来计算字符之间的位映射。任何帮助都将不胜感激。问题是,对于两个建议的输入文本,使用ASCII代码表来识别输入和输出之间的位映射。因此,我需要查看ASCII表中值的二进制表示形式,并找到一种在所有值中都通用的模式

简言之:

input : abcdefghijklmnopqrstuvwxyz
output: hpxaiqybjrzcksf{dlt|emu}gfnv
这是代码的框架:

#include <stdio.h>

int main(void)
{
    int inChar, outChar;

    while((inChar = getchar())!=EOF)
    {
        //your code here

        //last statement in while loop
        putchar(outChar);
    }
    return 0;
}

使用该框架,如果您只能将代码放入循环中,那么每次只需计算查看字符串的字符。这是非常缓慢的,但完成工作,真的没有其他好办法,如果你不能把代码外的循环

好了:

#include <stdio.h>

int main(void)
{
    int inChar, outChar;

    while((inChar = getchar())!=EOF)
    {
        char *in  = "abcdefghijklmnopqrstuvwxyz";
        char *out = "hpxaiqybjrzcksf{dlt|emu}gfnv";
        char *match;

        match = strchr(in, inChar);

        if (match == NULL)
            outChar = '?'; // Some default char in case nothing matches.
        else
            outChar = out[match - in];

        putchar(outChar);
    }
    return 0;
}
字符中未出现的字符将替换为\0。如果需要,可以使用初始memset将默认值设置为其他值


另外,您提供的两个字符串的长度不同,您可能需要检查。

您不需要位或ASCII表在第一个字符串中找到输入字符,然后在第二个字符串的相同位置输出字符。@stark我不确定从第二个字符串在相同位置输出字符是什么意思。你能详细说明一下吗?那么,你想要的是:while1{int ichr=getcstdin;if ichr==EOF break;int ochr=xlat[unsigned char ichr];fputcochr,stdout;}。并且,您希望使用以下命令初始化xlat:unsigned char xlat[256]={['a']='h',['b']='p',['c']='x',…}???根据给定的翻译,您没有可以执行ochr=xlatfuncichr的功能,例如:ochr=ichr+27%256;最简单/最快的方法是转换表。为什么输入和输出字符串的长度不同?这是字符之间的映射。老实说,我一点也不懂。我是C语言的初学者。我很确定我只应该使用位运算符,因为我们还没有讨论过指针。至于琴弦,我只是注意到了,是的。但这就是问题所说的。这与我将要做的(将要做的)相似,但它需要一些澄清(来自OP),因为out_chars比in_chars大。事实上,*p将超过in_chars[e.UB]@CraigEstey no的结尾,而*p&&*q map[*p++]=*q++;依赖于*p是非负的。在本例中为True,对于ASCII为True,但在一般情况下不为True。考虑MAP[UNCHARCHAR*P+++ ]。还有char-map[256]->unsigned char-map[256]@freakPie225如果你一条接一条地添加信息,我将无法帮助你,不幸的是,我无法读懂你的心思。是的,它可以在没有另一个循环的情况下完成,您可以用strhr函数替换我的解决方案中的for循环,以检查字符在第一个字符串中的位置。不,它不能用二进制级别的东西来完成。这是一个替代密码,除了我给你们展示的两个解决方案,真的没有什么可做的了。
 #include <stdio.h>
 #include <math.h>

 bool IsBitSet(int b, int pos)
 {​​​​​​
      return (b & (1 << pos)) != 0;
 }​​​​​​

 int SetBit(int value, int bitToSet)
 {​​​​​​
     return value | (int)pow(2, bitToSet);
 }​​​​​​

 int ClearBit(int value, int bitToClear)
 {​​​​​​
     return (value & ~((int)pow(2, bitToClear)));
 }​​​​​​

int main(void)
{​​​​​​
      unsigned char inChar= 0, outChar=0;
      while ((inChar = getchar()) != EOF)
{​​​​​​
// Your bitwise code appears here…
char isFirstBitset = IsBitSet(inChar, 0);
char isSecondBitset = IsBitSet(inChar, 1);
char isFourthBitset = IsBitSet(inChar, 3);
char isFifthBitset = IsBitSet(inChar, 4);

// If first bit is set
if (isFirstBitset)
{​​​​​​
    inChar = SetBit(inChar, 3);
    if (!isFourthBitset)
        inChar = ClearBit(inChar, 0);
}​​​​​​

// If 2nd bit is set
if (isSecondBitset)
{​​​​​​
    inChar = SetBit(inChar, 4);
    if (!isFifthBitset)
        inChar = ClearBit(inChar, 1);
}​​​​​​

// if 4th bit is set
if (isFourthBitset)
{​​​​​​
    inChar = SetBit(inChar, 0);
    if (!isFirstBitset)
        inChar = ClearBit(inChar, 3);
}​​​​​​

// if 5th bit is set
if (isFifthBitset)
{​​​​​​
    inChar = SetBit(inChar, 1);
    if (!isSecondBitset)
        inChar = ClearBit(inChar, 4);
}​​​​​​

outChar = inChar;
putchar(outChar);
 }​​​​​​
 return 0;
   }​​​​​​
 #include <stdio.h>
 #include <math.h>

 bool IsBitSet(int b, int pos)
 {​​​​​​
      return (b & (1 << pos)) != 0;
 }​​​​​​

 int SetBit(int value, int bitToSet)
 {​​​​​​
     return value | (int)pow(2, bitToSet);
 }​​​​​​

 int ClearBit(int value, int bitToClear)
 {​​​​​​
     return (value & ~((int)pow(2, bitToClear)));
 }​​​​​​

int main(void)
{​​​​​​
      unsigned char inChar= 0, outChar=0;
      while ((inChar = getchar()) != EOF)
{​​​​​​
// Your bitwise code appears here…
char isFirstBitset = IsBitSet(inChar, 0);
char isSecondBitset = IsBitSet(inChar, 1);
char isFourthBitset = IsBitSet(inChar, 3);
char isFifthBitset = IsBitSet(inChar, 4);

// If first bit is set
if (isFirstBitset)
{​​​​​​
    inChar = SetBit(inChar, 3);
    if (!isFourthBitset)
        inChar = ClearBit(inChar, 0);
}​​​​​​

// If 2nd bit is set
if (isSecondBitset)
{​​​​​​
    inChar = SetBit(inChar, 4);
    if (!isFifthBitset)
        inChar = ClearBit(inChar, 1);
}​​​​​​

// if 4th bit is set
if (isFourthBitset)
{​​​​​​
    inChar = SetBit(inChar, 0);
    if (!isFirstBitset)
        inChar = ClearBit(inChar, 3);
}​​​​​​

// if 5th bit is set
if (isFifthBitset)
{​​​​​​
    inChar = SetBit(inChar, 1);
    if (!isSecondBitset)
        inChar = ClearBit(inChar, 4);
}​​​​​​

outChar = inChar;
putchar(outChar);
 }​​​​​​
 return 0;
   }​​​​​​