题目:输入一个字符串,内有数字字符和非数字字符,例如:A123x456 17960?302tab5879.将其中连续的数字作为一个整数,依次存放在一个数组a中,例如:123存放在a[0]中,456存放在a[1]中··……,统计共有多少个整数,并且输出这些整数。
提示:数字字符在计算机中按ASCII码存放,十进制为48~57,十六进制为30~39.
我的方法是全部用于字符来处理,如下所示:
流程图
#include
#include
#include
#define N 15 //用于存放字符串的长度
#define M (N-4) //二维数组的行数
int main()
{
char a[M][N], b[N];
char* num[M]; //用来存放字符串
int i, j, k;
int t=0; //存放所有整数的位数(有多少位)
int z; //筛选出有多少个整数
printf("请输入一个字符串:");
scanf_s("%s", b, N);
for (i = 0, z = 0; i <N; i++)
{
if(b[i]!='\0')
if ((b[i] >=48) && (b[i] <= 57))
{
j = i;
k = 0;
while ((b[j] >= 48) && (b[j] <= 57))
{
a[z][k] = b[j];
if (j < N - 1)
{
k++;
j++;
if(t<=k)
t = k;
}
}
num[z] =a[z];
z++;
i = j;
}
}
printf("共有%d个整数。\n", z);
for (i = 0; i <z; i++)
printf("整数有%s\n",num[i]);
for (i = 0; i < z; i++)
{
printf("数字字符:");
for (j = 0; j < t; j++)
printf("%c",a[i][j]);
putchar('\n');
}
return 0;
}
该程序是把每个字符筛选出来,分别存放在一个二维数组中的前几个位置,最后采用字符输出。
程序运行出现如下情况:会发现出现很多不明字符,这是为什么呢?
原因是对一个字符数组以%s的格式输出,这就导致一个问题,比如一个字符串长度为10个字符,但是我知前几个赋值,例如对前三个赋值,我以字符串格式输出,是把整个字符串输出,所以为赋值的部分会输出什么就不得而知。这个问题可以解决,就是在输出的时候,我不输出未赋值的字符,这个时候只能以%c的字符输出,但是当位数差异过大时,就出现最后三行所示情况,有没有办法解决?
改一下程序流程,就可以输出上图所示结果。
int main()
{
char a[M][N], b[N];
char* num[M];//用来存放字符串
int i, j, k;
int t = 0;//存放所有整数的位数(有多少位)
int z;//筛选出有多少个整数
int m, n;
printf("请输入一个字符串:");
scanf_s("%s", b, N);
for (i = 0, z = 0; i < N; i++)
{
if (b[i] != '\0')
if ((b[i] >= 48) && (b[i] <= 57))
{
j = i;
k = 0;
while ((b[j] >= 48) && (b[j] <= 57))
{
a[z][k] = b[j];
if (j < N - 1)
{
k++;
j++;
t = k;
}
}
num[z] = a[z];
i = j;
printf("数字字符:");
for (n = 0; n < t; n++)
printf("%c", a[z][n]);
putchar('\n');
z++;
}
}
return 0;
}
放法二:
#include
#include
#include
int main()
{
char str[50], * pstr;
int i, j, k, m, e10, digit, ndigit, a[10], * pa;
printf("input a string:\n");
gets_s(str);
pstr = &str[0]; //字符指针Pstr用于存放数组str首地址
pa = &a[0]; //指针pa置于a数组首地址
ndigit = 0; //存放有多少个整数
i = 0; //代表字符串中第几个字符
j = 0;
while (*(pstr + i) != '\0')
{
if ((*(pstr + i) >= '0') && (*(pstr + i) <= '9'))
j++;
else
{if(j>0)
{
digit = *(pstr + i - 1) - 48; //将个位数赋予digit
k = 1;
while(k<j) //两位数的就累加在digit里
{
e10 = 1;
for (m = 1; m <= k; m++)
e10 = e10 * 10; //个十百千万这样的倍数因子
digit = digit + (*(pstr + i - 1 - k) - 48) * e10;//累加出这个整数,是一个数值
k++;
}
*pa = digit; //将数值赋予数组a
ndigit++;
pa++; //指针指向数组a下一元素
j = 0;
}
}
i++;
}
if (j > 0)
{
digit = *(pstr + i - 1) - 48;
k = 1;
while (k < j)
{
e10 = 1;
for (m = 1; m <= k; m++)
e10 = e10 * 10;
digit = digit + (*(pstr + i - 1 - k) - 48) * e10;
k++;
}
*pa = digit;
ndigit++;
j = 0;
}
printf("There are %d numbers in this line,they are:\n", ndigit);//输出各个数值
j = 0;
pa = &a[0];
for (j = 0; j < ndigit; j++)
printf("%d", *(pa + j));
printf("\n");
return 0;
}
程序里是将一个字符串里面的数字字符筛选出来,然后经过乘以10,100,等这样的处理得到一个整数。然后输出这个整数。
程序的执行是先将一个字符串中的一个数字字符的个数统计出来,然后通过digit = digit + (*(pstr + i - 1 - k) - 48) * e10这样的语句把每个数扩大10倍或者100倍等等将字符转变为相应的整数。得出结果并输出。