printf("%d %c",'1'+'0','1'+'0')
会输出97 a
同样的原理1+'0',会得到49(也就是'1'的ascii码),如果是
printf("%d %c",1+'0',1+'0')
就会输出49 1
①命令行
#include<stdio.h>
#include<string.h>
~
②定义函数-初始化
/*定义函数和字符串变量。*/
char *fun(char *s1,char *s2,char *r)
/*初始化,即赋初值。*/
{int len,cy=0,md
char *p,*q,*t
len=strlen(s1)
/*len=s1的长度=s2的长度。*/
p=s1+len-1
/*p用于储存,s1用于移动。
s1为数组名,指向数组首地址。指针s1向后移动len-1位,即指向字符串最后一位。*/
q=s2+len-1
/*q用于储存,s2用于移动。
s2为数组名,指向数组首地址。指针s2向后移动len-1位,即指向字符串最后一位。*/
t=r+len
/*t用于存储p和q指向字符相加的结果,
r用于移动,指向相加后数据首地址,可能产生进位,多预留一位,即len不减1。*/
*(t+1)='\0'
/*因为预留一位,所以字符串结束字符也向后移动一位。*/
~
③定义函数-循环函数
while(p>=s1)
{md=*p-'0'+*q-'0'+cy
/*md表示made decimal创建十进制数,即字符串相加后的数值。星p-'0'表示将字符转换成数值。*/
if(md>=10) cy=1
else cy=0
/*cy表示carry ,进位标志位。初始值为0,如果有进位,cy为1,下次循环时,加在更高一位上。*/
*t=md%10+'0'
/*星t用于储存,md用于计算,cy用于传递进位。
因为进位md可能大于10,所以取余取个位,+'0'转变为ASCLL码值。*/
p--q--t--}
/*向前移动,个位加完,加十位。*/
~
④定义函数-循环结束
if(cy==1) *t='1'
/*循环结束,即p<s1,由于p移动方向是向高位,此时p指向最高位。
如果cy==1,表示进位,令指针星t当前处为1。*/
else while(*r++=*++t)
/*如果cy==0,表示最高位没有数,令指针星t从当前处后移一位到有数的地方。*/
return r
/*相加后r所指字符串作为返回值。*/
}
~
⑤主函数
void main()
{char s1[100],s2[100],s3[101]
/*s123是用于存储字符串的数组,考虑相加后可能有进位,s3开辟101位储存空间。*/
strcpy(s1,"12345")
/*初始化s12,即赋初值。*/
strcpy(s2,"54321")
fun(s1,s2,s3)
printf("%s+%s=%s\n",s1,s2,s3)
}
~
⑥思路
1.字符串:s1,s2,s3(形参r)
2.字符转换成数值
借助指针:p,q,t
转换成ASCLL码值
即数值:*p,*q,*t
转换成对应整数
即数值:*p-'0',*q-'0',md%10+'0'
3.数值转换成字符串:r
即r所指的字符串。
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char str[100]
char buf[10]
int i
int n = 0
bool flag = 0
int j = 0
//gets(str)
scanf("%s", str)
for (i = 0i != strlen(str)++ i)
{
if (str[i] >= '0' &&str[i] <= '9')
{
buf[j] = str[i]
j++
flag = 1
}
else if (flag)
{
n += atoi(buf)
memset(buf,0,10)//清空缓存区
flag = 0
j = 0
}
}
printf("%s",buf)
printf("%d\n", n)
}
扩展资料
(C语言)常见字符函数和字符串函数
1、strlen
功能:计算字符串长度,不包含’\0’
返回值:返回字符串的字符数
说明:strlen() 函数计算的是字符串的实际长度,遇到第一个’\0’结束;参数指向的字符串必须以 ’ \0 ‘结束。函数返回值一定是size_t ,是无符号的。如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到’\0’停止。
sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数。
2、strcpy
功 能: 将参数src字符串拷贝至参数dest所指的地址
返回值: 返回参数dest的字符串起始地址
说明:源字符串必须以’\0’结束。会将源字符串的’\0’拷贝到目标空间。目标空间必须可变。如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况,在编写程序时需特别留意,或者用strncpy()来取代。