我想将以下字符串拆分为字母和数字,然后我需要计算数字的总和。我的示例问题是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;
}
答案 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!这会把他们变成不同的角色。