char into int并计算int的总和

时间:2014-06-08 17:29:19

标签: c

我想将以下字符串拆分为字母和数字,然后我需要计算数字的总和。我的示例问题是a[20]={"abcd123dc2"};

预期产出:

abcddc 8

我的代码:

int main()
{
    char a[20] = {"abcd123dc2"};
    int l = 0, m = 0, n = 0, j, cc = 0, ll = 0;
    char b[20];
    char c[10];
    l = strlen(a);
    printf("%d", l);
    for (j = 0; j < l; j++)
    {
        if (a[j] == 'a' || a[j] == 'b' || a[j] == 'd' || a[j] == 'c')
        {
            b[m] = a[j];
            m++;
        }
    }
    b[m] = '\0';
    for (j = 0; j < l; j++)
    {
        if (a[j] == '3' || a[j] == '2' || a[j] == '1')
        {
            c[n] = a[j];
            n++;
        }
    }
    ll = strlen(c);
    atoi(c);
    for (j = 0; j < ll; j++)
    {
        cc += c[j];
    }
    printf("%d\n\n", cc);
    printf("%s", b);
    getch();
    return 0;
}

3 个答案:

答案 0 :(得分:1)

char a[20]={"abd123vf"};
int l=0,m=0,j,cc=0;
char b[20];
l=strlen(a);

for(j=0;j<l;j++)
{
 if(a[j]> 47 && a[j] <58){
 cc+ = a[j] - '0';
}
 else{
  b[m]=a[j];
  m++;
 }
}
b[m]='\0';

printf("%d\n\n",cc);
printf("%s",b);
getch();
return 0;

在第一条评论后编辑:

由于您没有特别提及问题,我假设您正在寻找更好的编写此代码的方法。

不是两次循环你的字符串,你可以一次性完成。 您可以检查字符是否在以下范围内,而不是检查单个数字或字母:48 - 57 [即0到9]

如果条件不是两个,你可以去找别的。 [请注意,在这种情况下,即使原始字符串中的特殊字符也将成为新字符串的一部分]

a[j] - '0'将给出字符串中的实际数字。例如: 如果数字为5,则[j]为53; &#39; 0&#39;是48; 53 - 48 = 5,这就是你加入的金额

答案 1 :(得分:0)

您的代码在大多数情况下都可以。

计算c时出现一个错误。而不是

    cc += c[j]; // The integer value of c[j] when it is `0` is 48, not 0

您需要使用

    cc += c[j] - '0';

根据问题顶部的预期输出,您的printf

printf("%d\n\n",cc);
printf("%s",b);

需要

printf("%s %d\n",b,cc);

其他

您对[{1}}进行了不必要的通话。那只是为了调试吗?

答案 2 :(得分:0)

我不会这样做,算法实际上非常简单。适用于每个字符串。

char a[] = "abcd123dc2";
char b[20];
char c[20];
int i, spotinnumbers = 0, spotincharacters = 0;
for(i = 0 ; i < strlen(a) ; i++)
{
    if((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z'))
    {
        b[spotincharacters] = a[i];
        spotincharacters++;
    }
    else if(a[i] >= '0' && a[i] <= '9')
    {
        c[spotinnumbers] = a[i];
        spotinnumbers++;
    }
}
b[spotincharacters] = '\0';
c[spotinnumbers] = '\0';

代码的一些解释。基本上,它没有分裂,只有另外两个字符串,主字符串中的一个字母和其中的一个数字。我们使用一个循环来运行字符串,并确定该字符是字母或数字,并将其分配到正确的位置。

关于总和计算......因为我们在c中有数字:

int total = 0;
for(i = 0 ; i < strlen(c) ; i++)
{
   total += c[i]-'0';
}

关于这段代码的解释,在这段代码中,作为C中的字符串只是一个字符数组,在字符串中我们有类似数字的字符,但字符是&#39; numeric中的值是称为ASCII值的值。您可以查看ASCII Table并找出每个字符都有一个数字值,总共有256个字符(2 ^ 8),这就是字符占用一个字节(1个字节= 8位)的原因= 2 ^ 8种不同数字的可能性)。 &#39; 0&#39;的ASCII是48,这就是我们基本上如何将一个数字从一个字符转换为它的真实数值。对于0(48-48 = 0)和1(49-48 = 1),因为ASCII表中的所有数字字符都是一系列的。

代码中的实际问题不仅仅是效率,因为不需要在两个循环中运行,因此,您将数字的数值输入C!这会把他们变成不同的角色。