这是我的程序的示例代码,我必须在其中添加两个字符串类型 integer (ex: "23568" and "23674")
。所以,我正在尝试单次char
加法。
char first ='2';
char second ='1';
我正在尝试这样..
i=((int)first)+((int)second);
printf("%d",i);
我得到输出99,因为它添加了两者的ASCII值。任何人都请建议我,在C中添加 char 类型编号的方法应该是什么。
由于您的示例将两个单个字符添加在一起,因此您可以确信知道两件事
所以;
char a = '2';
char b = '3';
int i = (int)(a-'0') + (int)(b-'0');
将永远有效。即使在 EBCDIC 中(如果您不知道那是什么,请认为自己很幸运)。
如果您的意图是实际添加两个当前以字符串形式(“12345”,“54321”)的多个数字,那么strtol()是您最好的选择。
i=(first-'0')+(second-'0');
无需将 char 转换为 int。
如果你想添加字符的数字表示,我会使用“(first - '0')+(second - '0');”
这个问题似乎很有趣,虽然它会比它更容易,但添加“字符串数字”有点棘手(更不用说我使用的丑陋方法)。
此代码将添加两个任意长度的字符串,它们不需要与从后面开始添加的长度相同。您提供两个字符串,足够长度的缓冲区,并确保字符串仅包含数字:
#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);
}
好吧...您已经在添加 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
事实上,您甚至不需要键入强制转换字符来执行此操作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
但请注意,它不适用于十六进制字符
如果你想逐个扫描数字,简单的atoi函数就可以了
你可以使用 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();
}
希望我回答了你的问题