2.字符串经典例题

1.提取字符串中的数字

/*

提取字符串中的数字

输入一串字符串,该字符串中可能含有数字,把里面找到的数字求和

例如:

输入: abc123def45ghijk6mn

输出: 174 ---> ( 123 + 45 + 6 )

*/

#include <stdio.h>

#include <string.h>

int get_num_in_string( char *s )

{

int num = 0;

int sum = 0; //保存结果

int i;

for( i=0; i<strlen(s) ; i++ )

{

if( s[i]>='0' && s[i]<='9' ) //是数字

{

num = num*10 + s[i] - 48; //合成数字

if( s[i+1]<'0' || s[i+1]>'9' ) //下一个不是数字

{

sum = sum + num;

num = 0;

}

}

}

return sum;

}

int main()

{

char str[32] = {0};

scanf("%s", str );

int n = get_num_in_string( str );

printf("n = %d\n", n );

}

结果如下图:

2.写一个函数, 实现两个超大数的相加

11374834738563857732723872750952525

347542387382572837532572357

提示: 用字符串

字符转数字,数字转字符

考虑进位

#include <stdio.h>

#include <string.h>

//字符转数字

void char_to_int( char *s )

{

int i=0;

int n = strlen(s);

for(i=0; i<n; i++ )

{

s[i] = s[i] - '0';

}

}

//数字转字符

void int_to_char( char *s , int n)

{

int i;

for(i=0; i<n; i++ )

{

s[i] = s[i] + '0';

}

}

void add_biggest( char *num1, char *num2, char *sum )

{

char *p1, *p2; //定义两个指针,分别指向要处理的数据

p1 = num1 + strlen(num1); //首先指向个位

p2 = num2 + strlen(num2);

int i; //表示 加法的结果最低位保存在sum数组的 下标

i = strlen(num1)>strlen(num2) ? strlen(num1) : strlen(num2) ;

int temp = i;

char_to_int(num1); //把字符转换成数字

char_to_int(num2);

while( p1 != num1 && p2 != num2 ) //当有一个数加完 就结束

{

sum[i] = sum[i] + (*p1 + *p2);

if( sum[i] >= 10 ) //进位

{

sum[i] = sum[i] % 10;

sum[i-1] = sum[i-1] + 1; //进位

}

p1--;

p2--;

i--;

}

if( p1 == num1 && p2 != num2 ) // num2还有剩余

{

while( p2 != num2 )

{

sum[i] = sum[i] + *p2;

if( sum[i] >= 10 )

{

sum[i] = sum[i] % 10;

sum[i-1] = sum[i-1] + 1; //进位

}

p2--;

i--;

}

}

else if( p1 != num1 && p2 == num2 ) // num1还有剩余

{

while( p1 != num1 )

{

sum[i] = sum[i] + *p1;

if( sum[i] >= 10 )

{

sum[i] = sum[i] % 10;

sum[i-1] = sum[i-1] + 1; //进位

}

p1--;

i--;

}

}

//最后 将结果sum 从数字转换成字符

int_to_char( sum, temp );

}

int main()

{

char num1[128] = {58};

char num2[128] = {58};

char sum[129] = {58};

scanf("%s%s", num1+1, num2+1 );

//相加

add_biggest( num1, num2 , sum );

sum[0] = sum[0] - 58;

if( sum[0] == '0' ) //没有进位

{

printf("sum = %s\n", sum+1 );

}

else //有进位

{

printf("sum = %s\n", sum );

}

}

​结果如下图:

3.删除字符串中 数字前面的0

/*

输入一串字符,字符串里面可能含有数字,把数字前面的0删除

如果只是一个或者连续的多个0,只保留一个0

输入: abc1000024edfg000023hkjjjj000000lmn0fkkkhjk

输出: abc1000024edfg23hkjjjj0lmn0fkkkhjk

数字前面的0全删

中间的0 不删

连续多个0或者单独一个0 只保留一个0

*/

#include <stdio.h>

#include <string.h>

char *delete_zero( char *s )

{

int flag = 0; //0表示字母,1表示非0数字

int i=0, k=0;

for( i=0; i<strlen(s) ; i++ )

{

if( s[i] > '0' && s[i] <= '9' ) //非0数字

{

flag = 1;

}

if( s[i] < '0' || s[i] > '9' ) //字母

{

flag = 0;

}

//如果本身为0,前面没有出现非0数字,且下一个还是数字,删除

if( s[i] == '0' && flag == 0 && ( s[i+1] >= '0' && s[i+1] <= '9' ) )

{

continue;

}

s[k++] = s[i];

}

s[k] = '\0';

return s;

}

int main()

{

char buf[256] = {0};

scanf("%s", buf );

delete_zero( buf );

printf("%s\n", buf );

}

结果如下图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值