如何在c中添加char类型整数

时间:2012-11-12 13:19:34

标签: c char ascii

这是我的程序的示例代码,其中我要添加两个字符串类型整数(ex: "23568" and "23674")。所以,我尝试添加单char

char first ='2';
char second ='1';

我是这样想的..

i=((int)first)+((int)second);
printf("%d",i);

我输出 99 ,因为它添加了两者的 ASCII 值。任何人请建议我,在 C 中添加char类型号的方法应该是什么。

8 个答案:

答案 0 :(得分:8)

由于您的示例将两个单个字符添加到一起,因此您可以放心地知道两件事

  1. 总数不会超过18个。
  2. 您可以完全避免通过库调用进行任何转换。该标准要求'0'到'9'是顺序的(实际上它是标准强制要求的唯一字符序列)。
  3. 因此;

    char a = '2';
    char b = '3';
    
    int i = (int)(a-'0') + (int)(b-'0');
    

    始终工作。即使在EBCDIC中(如果你不知道那是什么,请认为自己很幸运)。

    如果您打算实际添加两个数字,每个数字目前都是字符串形式(“12345”,“54321”),那么 strtol() 是您的最佳选择。

答案 1 :(得分:5)

i=(first-'0')+(second-'0');

无需将char转换为int。

答案 2 :(得分:1)

如果你想添加字符的数字表示,我会使用"(第一 - ' 0')+(第二 - ' 0');&# 34;

答案 3 :(得分:1)

这个问题看起来很有意思,虽然它会比它更容易,但添加“字符串数字”有点棘手(甚至更多的是我使用的丑陋方法)。

此代码将添加两个任意长度的字符串,它们不需要与从后面开始添加的长度相同。您提供两个字符串,一个足够长度的缓冲区,并确保字符串只包含数字:

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

char * add_string_numbers(char * first, char * second, char * dest, int dest_len)
{
    char * res = dest + dest_len - 1;
    *res = 0;

    if ( ! *first && ! *second )
    {
        puts("Those numbers are less than nothing");
        return 0;
    }

    int first_len = strlen(first);
    int second_len = strlen(second);

    if ( ((first_len+2) > dest_len) || ((second_len+2) > dest_len) )
    {
        puts("Possibly not enough space on destination buffer");
        return 0;
    }

    char *first_back = first+first_len;
    char *second_back = second+second_len;

    char sum;
    char carry = 0;

    while ( (first_back > first) || (second_back > second) )
    {
        sum = ((first_back  > first)  ? *(--first_back) : '0')
            + ((second_back > second) ? *(--second_back) : '0')
            + carry - '0';

        carry = sum > '9';
        if ( carry )
        {
            sum -= 10;
        }

        if ( sum > '9' )
        {
            sum = '0';
            carry = 1;
        }

        *(--res) = sum;
    }

    if ( carry )
    {
        *(--res) = '1';
    }

    return res;
}

int main(int argc, char** argv)
{
    char * a =              "555555555555555555555555555555555555555555555555555555555555555";
    char * b = "9999999999999666666666666666666666666666666666666666666666666666666666666666";
    char r[100] = {0};

    char * res = add_string_numbers(a,b,r,sizeof(r));

    printf("%s + %s = %s", a, b, res);

    return (0);
}

答案 4 :(得分:0)

嗯......你 已经添加了char类型,因为你注意到49 10 和50 10 这应该给你99 <子> 10

如果您询问如何添加两个字符(即'1' + '2' == 3)的重新处理值,则可以减去基数'0'

printf("%d",('2'-'0') + ('1'-'0')); 

这给出了3作为int,因为:

'0' = ASCII 48<sub>10</sub>
'1' = ASCII 49<sub>10</sub>
'2' = ASCII 50<sub>10</sub>

所以你正在做:

printf("%d",(50-48) + (49-48));

如果您想要更长的号码,可以使用atoi(),但此时必须使用字符串:

int * first = "123";
int * second = "100";
printf("%d", atoi(first) + atoi(second));

>> 223

答案 5 :(得分:0)

事实上,您甚至不需要使用单个char来表示使用单个 #include <stdlib.h> #include <stdio.h> int main(int argc, char* argv[]) { char f1 = '9'; char f2 = '7'; int v = (f1 - '0') - (f2 - '0'); printf("%d\n", v); return 0; } 来填充字符:

2

将打印{{1}}

但是要小心,它不适用于十六进制字符

答案 6 :(得分:-1)

如果您想逐个数字扫描,简单的atoi功能就可以了

答案 7 :(得分:-2)

你可以用 atoi()函数

#include <stdio.h>
#include <stdlib.h>
void main(){
    char f[] = {"1"};
    char s[] = {"2"};
    int i, k;
    i = atoi(f);
    k = atoi(s);
    printf("%d", i + k);
    getchar();
}

希望我回答你的问题