3

这是我的程序的示例代码,我必须在其中添加两个字符串类型 integer (ex: "23568" and "23674")。所以,我正在尝试单次char加法。

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

我正在尝试这样..

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

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

4

8 回答 8

9

由于您的示例将两个单个字符添加在一起,因此您可以确信知道两件事

  1. 总数永远不会超过 18 个。
  2. 您可以完全通过库调用避免任何转换。该标准要求“0”到“9”是连续的(实际上它是标准规定的唯一字符序列)。

所以;

char a = '2';
char b = '3';

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

永远有效。即使在 EBCDIC 中(如果您不知道那是什么,请认为自己很幸运)。

如果您的意图是实际添加两个当前以字符串形式(“12345”,“54321”)的多个数字,那么strtol()是您最好的选择。

于 2012-11-12T13:29:30.957 回答
5
i=(first-'0')+(second-'0');

无需将 char 转换为 int。

于 2012-11-12T13:23:46.893 回答
1

如果你想添加字符的数字表示,我会使用“(first - '0')+(second - '0');”

于 2012-11-12T13:28:44.747 回答
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);
}
于 2012-11-12T14:34:07.747 回答
0

好吧...您已经在添加 char 类型,正如您所指出的那样 49 10和 50 10应该给您 99 10

如果你问如何添加两个字符的 reperserented 值,即'1' + '2' == 3你可以减去 base '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
于 2012-11-12T13:30:27.947 回答
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

请注意,它不适用于十六进制字符

于 2012-11-12T13:37:10.607 回答
-1

如果你想逐个扫描数字,简单的atoi函数就可以了

于 2012-11-12T13:27:29.267 回答
-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();
}

希望我回答了你的问题

于 2012-11-12T13:33:05.907 回答