专业编程基础技术教程

网站首页 > 基础教程 正文

(每天一道C语言)||统计字符串中的数字字符并作为整数输出

ccvgpt 2025-04-06 14:12:41 基础教程 6 ℃

题目:输入一个字符串,内有数字字符和非数字字符,例如:A123x456 17960?302tab5879.将其中连续的数字作为一个整数,依次存放在一个数组a中,例如:123存放在a[0]中,456存放在a[1]中··……,统计共有多少个整数,并且输出这些整数。

提示:数字字符在计算机中按ASCII码存放,十进制为48~57,十六进制为30~39.

(每天一道C语言)||统计字符串中的数字字符并作为整数输出

我的方法是全部用于字符来处理,如下所示:




流程图

#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倍等等将字符转变为相应的整数。得出结果并输出。

最近发表
标签列表