免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 040712zhou
打印 上一主题 下一主题

字符串加1问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-07-29 12:14 |只看该作者
原帖由 windaoo 于 2009-7-29 02:18 发表
呵呵,短一点的版本:
#include
#include

char *fun(char *s)
{
    int i = strlen(s);

    while (i-- && s == '9' ? s = '0' : (s += 1, 0)) ...


不错

论坛徽章:
0
12 [报告]
发表于 2009-07-29 15:12 |只看该作者
原帖由 windaoo 于 2009-7-29 02:18 发表
呵呵,短一点的版本:
char *fun(char *s)
{
    int i = strlen(s);

    while (i-- && s == '9' ? s = '0' : (s += 1, 0)) ...


这个程序有个问题,当被加字符串全为9时,就得不到正确的值的。

下边是一个支持任意两个整数字符串相加的程序,

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <assert.h>

  5. char * add_str(const char *s1, const char *s2)
  6. {
  7.     int len1 = strlen(s1);
  8.     int len2 = strlen(s2);
  9.     char *a1 = malloc(len1 + 2);
  10.     char *a2 = malloc(len2 + 2);
  11.     char *result = malloc((len1 > len2 ? len1 : len2) + 1);
  12.     int carry = 0;
  13.     int i = 0, j = -1, t;

  14.     /* Use leading 0 as sentinel. */
  15.     sprintf(a1, "0%s", s1);
  16.     sprintf(a2, "0%s", s2);
  17.     while (len1 || len2) {
  18.         result[i++] = (carry + a1[len1] + a2[len2] - 2 * '0') % 10 + '0';
  19.         carry = (carry + a1[len1] + a2[len2] - 2 * '0') / 10;
  20.         if (len1) len1--;
  21.         if (len2) len2--;
  22.     }
  23.     if (carry)
  24.         result[i++] = carry + '0';
  25.     result[i] = 0;

  26.     /* Reverse the result. */
  27.     while (++j < --i) {
  28.         t = result[j];
  29.         result[j] = result[i];
  30.         result[i] = t;
  31.     }

  32.     free(a1);
  33.     free(a2);

  34.     return result;
  35. }

  36. int main()
  37. {
  38.     char a[100];
  39.     char b[100];
  40.     char *r;

  41.     while (1) {
  42.         printf("Please input integer a ans b:\n");
  43.         scanf("%s%s", a, b);
  44.         r = add_str(a, b);
  45.         printf("%s + %s = %s\n", a, b, r);
  46.         free(r);
  47.     }

  48.     return 0;
  49. }
复制代码

论坛徽章:
0
13 [报告]
发表于 2009-07-29 15:23 |只看该作者
ls理解错了你去运行一下就知道他那个是对的 是加一的简单情况

给一个加一个整数(这个整数不超过字符串的长度)的函数   当a=1时就是增1了

char *fun(char *s,int a)
{
&nbsp;&nbsp;&nbsp;&nbsp;int t,k=0,i = strlen(s)-1; // k为进位量

&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;while ( i>-1 && (a>0||k>0) )
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t=s[i]-'0'+a%10+k;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (t> 9)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i]=t%10+'0';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k=1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i] = t+'0';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   k=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   //break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a/=10;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i--;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;return s;
}


[ 本帖最后由 pumasuede 于 2009-7-29 15:24 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2009-07-29 15:55 |只看该作者

回复 #13 pumasuede 的帖子

怎么会是对的了,当要加的串为“99”时,这个算出来的是“00”吧。正确的应该是“100”的。
char *fun(char *s)
{
    int i = strlen(s);

    while (i-- && s == '9' ? s = '0' : (s += 1, 0));

    return s;
}

论坛徽章:
0
15 [报告]
发表于 2009-07-29 15:59 |只看该作者
原帖由 pumasuede 于 2009-7-29 15:23 发表
ls理解错了你去运行一下就知道他那个是对的 是加一的简单情况

给一个加一个整数(这个整数不超过字符串的长度)的函数   当a=1时就是增1了

char *fun(char *s,int a)
{
&nbsp;&nbsp;&nbsp;&nbsp;int t,k ...

考虑时要注意细节,当s存不下返回的结果怎么半。98 + 2 = 100。

论坛徽章:
0
16 [报告]
发表于 2009-07-29 16:57 |只看该作者
ls 存储字符串的buf大小由函数使用者决定
函数并不需要保证这一点

论坛徽章:
0
17 [报告]
发表于 2009-07-29 17:26 |只看该作者
LS,这种buf的方法对此函数不可用,s即是要被加的数,又要保存计算的结果。
如果用户这样调用该函数,问题就出来了。
1 fun("123", 1).     /* Seg error */
2. char a[] = "99";
   fun(a, 1);       /* Overflow or result is wrong. */
总之,如果你的函数是让别人用的,还是尽量避免这种形式。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
18 [报告]
发表于 2009-07-30 13:46 |只看该作者
原帖由 040712zhou 于 2009-7-28 22:15 发表
各位达人,小弟问下用C语言如何实现将字符串加1,例如:a = "010000023459";加1后结果输出字符串为"010000023460"
谢谢了

没那么费事吧?先变成数字,运算后再变成字符串。
{
long long I;
char a[20];

        I=atoll("010000023459");
        I++;
        sprintf(a,"%012lld",I);
        printf("%s\n",a);
}

[ 本帖最后由 yulihua49 于 2009-7-30 13:53 编辑 ]

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
19 [报告]
发表于 2009-07-30 13:53 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
20 [报告]
发表于 2009-07-30 13:54 |只看该作者
如果超多的话,取字符串的后6位,atol转成长整形,自加1,转成字符型,再替换字符串的后6位
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP