将整数转换为ASCII字符

95

我有

int i = 6;

我想要

char c = '6'

通过转换。有什么简单的建议吗?

编辑: 我还需要生成一个随机数,将其转换为char,然后添加一个“.txt”,并在ifstream中访问它。

11个回答

406

简单明了的方式:

char digits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
char aChar = digits[i];

更安全的方法:

char aChar = '0' + i;

通用的方式:

itoa(i, ...)

方便的方法:

sprintf(myString, "%d", i)

C++方式:(取自Dave18的答案)

std::ostringstream oss;
oss << 6;

老板的方式:

乔,编写一个将整数转换为字符的程序。

学霸的方式:

char aChar = '6';

乔的方式:

char aChar = '6'; //int i = 6;

NASA的方式:

//正在等待卫星回应...

外星人的方式:'9'

//问候。

上帝的方式:

我建造了这个。

彼得·潘的方式:

char aChar;

switch (i)
{
  case 0:
    aChar = '0';
    break;
  case 1:
    aChar = '1';
    break;
  case 2:
    aChar = '2';
    break;
  case 3:
    aChar = '3';
    break;
  case 4:
    aChar = '4';
    break;
  case 5:
    aChar = '5';
    break;
  case 6:
    aChar = '6';
    break;
  case 7:
    aChar = '7';
    break;
  case 8:
    aChar = '8';
    break;
  case 9:
    aChar = '9';
    break;
  default:
    aChar = '?';
    break;
}

圣诞老人的做法:

//Wait till Christmas!
sleep(457347347);

引力的方法:

//是什么?

'6' (Jersey) Mikes™的方法:

//

SO的方法:

伙计们,我该如何避免阅读 C++ 初学者指南?

我的方法:

要么按我的方式去做,要么滚蛋。

评论:我添加了 Handy way 和 C++ way(以便拥有完整的收藏),我将其保存为 wiki。

编辑:满意了吗?


16
你的意思是“老板”的上级意义,但我理解成了“老板”,就像“布鲁斯·斯普林斯汀(Bruce Springsteen)是老板”一样。或许你可以为这种情况进行修改? - user67416
8
关于乔的方式?还是NASA的方式?或外星人的方式?或上帝的方式?或小飞侠的方式?圣诞老人的方式怎么样?或重力的方式?你应该开始列一个清单。也许要检查两遍以防你漏掉了什么? - AbstractDissonance
2
@AbstractDissonance,我可以用Mikes Way™得到那个吗... 我喜欢Jersey Mikes。 - cb88
1
这让我笑得很厉害。 - NateW
1
这一定是SO上最好的答案 xD - Seth
显示剩余8条评论

37

这只适用于数字0-9,但你的问题似乎表明这可能已经足够。

它的工作原理是将字符'0'的ASCII值加到整数数字上。

int i=6;
char c = '0'+i;  // now c is '6'
例如:
'0'+0 = '0'
'0'+1 = '1'
'0'+2 = '2'
'0'+3 = '3'

编辑

不太清楚你的意思,“work for alphabets”是什么意思? 如果你想要字母表中的第五个字母:

int i=5;
char c = 'A'-1 + i; // c is now 'E', the 5th letter.

请注意,由于在C / Ascii中,A被认为是字母表的第0个字母,因此我进行了减1以补偿通常理解的第5个字母的含义。

根据您的具体情况进行适当的调整。
(并且测试-测试-测试!任何你编写的代码)


在选择大小写字母时容易混淆。 - user963241
4
好的,你需要告诉我们你想要什么。"为字母公司工作"这个说法并不够具体。 - EboMike

16

只是提醒一下,如果你想要超过个位数的数字,你可以使用sprintf:

char txt[16];
int myNum = 20;
sprintf(txt, "%d", myNum);

那么第一个数字就在txt[0]的字符中,以此类推。

(这是C语言的方法,而不是C++方法。C++方法是使用stringstreams)


3
总是优先使用snprintf而不是sprintf(考虑一个假设的系统,其整数长度为128位或其他长度)。如果在数字字符集不连续的情况下仍然能够正常工作,则额外加1分。 - Mark B
2
@Mark B:标准C要求数字必须是连续的。 - Billy ONeal
@Mark 对于缓冲区溢出方面来说,那绝对更安全。 - Nathan S.

5
我是如何将数字转换为ASCII码的。十六进制中0到9的编码分别为0x30-0x39。6的编码为0x36。
unsigned int temp = 6;
or you can use unsigned char temp = 6;
unsigned char num;
 num = 0x30| temp;

这将为您提供数字6的ASCII值。您可以对0-9执行相同的操作。

要将ASCII转换为数字值,我想出了以下代码。

unsigned char num,code;
code = 0x39; // ASCII Code for 9 in Hex
num = 0&0F & code;

4

我的做法是:

char to int
char var;
cout<<(int)var-48;
    
int to char
int var;
cout<<(char)(var|48);

我写了以下函数来进行转换:

int char2int(char *szBroj){
    int counter=0;
    int results=0;
    while(1){
        if(szBroj[counter]=='\0'){
            break;
        }else{
            results*=10;
            results+=(int)szBroj[counter]-48;
            counter++;
        }
    }
    return results;
}

char * int2char(int iNumber){
    int iNumbersCount=0;
    int iTmpNum=iNumber;
    while(iTmpNum){
        iTmpNum/=10;
        iNumbersCount++;
    }
    char *buffer=new char[iNumbersCount+1];
    for(int i=iNumbersCount-1;i>=0;i--){
        buffer[i]=(char)((iNumber%10)|48);
        iNumber/=10;
    }
    buffer[iNumbersCount]='\0';
    return buffer;
}

2

我想

std::to_string(i)

这个函数可以完成工作,它是一个重载函数,可以是任何数字类型,例如int、double或float。


2
例如:char c = to_string(9)[0]; - IceSea

2

我更喜欢这种方法,而不是abelenky建议的字符算术方法,因为它不依赖于使用ASCII字符集(尽管对于许多应用程序来说这是一个相当安全的假设)。然而,itoa将其结果存储在字符串中,因此您需要提供一个字符数组并从中提取字符。如果您编辑答案以显示这些额外步骤,那么对新手来说会更有帮助。 - A. Levy
5
对于itoa(非标准的MS函数)和链接到可能是C和C ++ [误导性]信息最糟糕的网站而言,两者都不能接受。 - R.. GitHub STOP HELPING ICE
对于C语言,http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf - 或者如果你不介意一些POSIX扩展(明确标记),http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html更加易于访问。 - R.. GitHub STOP HELPING ICE
@R..: 那个 PDF 有 HTML 版本吗? - Newbie
5
好的,那么相比于cplusplus.com,它就比较低劣了。 - Newbie
显示剩余3条评论

0

另一种方式,但是非标准的。

int i = 6;
char c[2];
char *str = NULL;
if (_itoa_s(i, c, 2, 10) == 0)
   str = c;

或者使用标准的C++ stringstream

 std::ostringstream oss;
 oss << 6;

itoa是非标准且不安全的(可能会导致缓冲区溢出)。 - EboMike
好的,你现在已经编辑成_s版本了。仍然不太标准,但我已经取消了我的负评! - EboMike
没错!我输错了对象名称,应该是 'oss' :) - cpx

0

我有一个 int i = 6;,我想通过转换得到 char c = '6'。你有什么简单的建议吗?

数字只有10个。所以编写一个函数,该函数接受0-9之间的整数并返回ASCII代码。只需在ASCII表中查找并编写一个带有ifs或选择情况的函数即可。


0

在完成大学作业时,我收集了所发现的数据并得出了以下结果:

“输入由多个整数组成的单行数据,以空格分隔。输入以数字-1作为结束标志,该数字不应被处理。”

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    char numeros[100]; //vetor para armazenar a entrada dos numeros a serem convertidos
    int count = 0, soma = 0;

    cin.getline(numeros, 100);

    system("cls"); // limpa a tela

    for(int i = 0; i < 100; i++)
    {
        if (numeros[i] == '-') // condicao de existencia do for
            i = 100;
        else
        {
            if(numeros[i] == ' ') // condicao que ao encontrar um espaco manda o resultado dos dados lidos e zera a contagem
            {
                if(count == 2) // se contegem for 2 divide por 10 por nao ter casa da centena
                    soma = soma / 10;
                if(count == 1) // se contagem for 1 divide por 100 por nao ter casa da dezena
                    soma = soma / 100;


                cout << (char)soma; // saida das letras do codigo ascii
                count = 0;

            }
            else
            {
                count ++; // contagem aumenta para saber se o numero esta na centena/dezena ou unitaria
                if(count == 1)
                    soma =  ('0' - numeros[i]) * -100; // a ideia é que o resultado de '0' - 'x' = -x (um numero inteiro)
                if(count == 2)
                    soma = soma + ('0' - numeros[i]) * -10; // todos multiplicam por -1 para retornar um valor positivo
                if(count == 3)
                    soma = soma + ('0' - numeros[i]) * -1; /* caso pense em entrada de valores na casa do milhar, deve-se alterar esses 3 if´s
        alem de adicionar mais um para a casa do milhar. */
            }
        }
    }

    return 0;
}

这些评论是葡萄牙语的,但我认为你应该能理解。 如果有任何问题,请在LinkedIn上给我发消息:https://www.linkedin.com/in/marcosfreitasds/


1
如果你或其他人能够翻译这些注释,那就太好了! - csabinho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接