这是我的程序的示例代码,其中我要添加两个字符串类型整数(ex: "23568" and "23674")
。所以,我尝试添加单char
。
char first ='2';
char second ='1';
我是这样想的..
i=((int)first)+((int)second);
printf("%d",i);
我输出 99 ,因为它添加了两者的 ASCII 值。任何人请建议我,在 C 中添加char类型号的方法应该是什么。
答案 0 :(得分:8)
由于您的示例将两个单个字符添加到一起,因此您可以放心地知道两件事
因此;
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)
#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();
}
希望我回答你的问题