admin 管理员组

文章数量: 887006

输入字符串,将其中连续的数字字符分别以一个整数形式输出(谭浩强C语言第5版第8章习题16)

对比《学习辅导》中的参考答案做出如下改进:

1.使用单独的函数处理,而不是在main()函数里处理。

char s[50];
int n[20];
int l = strlen(s);
int m = func(s, n, l);
int func(char *s, int *n, int l)

将指向存放输入字符串的字符数组的指针、指向存放转换结果的整型数组的指针、存放输入字符串的字符数组的长度作为实参送给func()函数,func()函数返回存放转换结果的整型数组的长度。

2.只将连续的(2个及以上)数字字符转换为整数。

根据题意如果严格处理,则应将连续的(2个及以上)数字字符转换为整数。《学习辅导》中使用变量 j 标记连续出现的数字字符,当 j>0 时即将数字字符转换为整数,改进为当 j>=2 时才转换为整数。

3.使用 pow(x,y) 函数将数字字符转换为整数。

原参考答案使用了一个 while 循环来计算:

while (k < j){e10 = 1;for (m = 1; m <= k; m++)e10 = e10 * 10;digit = digit + (*(pstr + i - 1 - k) - 48)*e10;k++;}

使用 pow(x,y) 要简便得多。

4.字符串结尾为数字字符的不做单独处理。

原参考答案为转换过程设置的 while 循环,是当当前处理的字符不为'\0'时执行,处理不了位于字符串结尾的连续数字字符,而是采用在 while 循环外再加一段代码解决。改进为 for 循环处理,循环次数“字符串的长度+1”,最后一次检测到字符'\0',也会执行循环体。

改进后的代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{int func(char *, int *, int);//将连续数字字符转换为整数的函数char s[50];//存放输入的字符串int m, n[20], i, l;//m转换后的整数的数量,n存储转换后的整数,l输入的字符串的长度printf("请输入字符串:\n");gets_s(s);l = strlen(s);m = func(s, n, l);printf("一共有%d个大于10的数,分别是:\n", m);for (i = 0; i < m; i++)printf("%d\n", n[i]);return 0;
}
int func(char *s, int *n, int l)
{int k[50], i, j = 0, h = 0, m, u = 0;//k临时存储单个转换结果,j标记连续出现的数字字符数量,h临时存储连续数字字符转换结果,u当前已完成多少个整数转换。for (i = 0; i <= l; i++){if ((*(s + i) >= 48) && (*(s + i) <= 57)){k[j] = *(s + i) - 48;//把单个数字字符的转化结果记录到k[50]j++;}else{if (j >= 2)//当连续出现的数字字符不小于2个时,执行转换{for (m = 0; m < j; m++)h = h + pow(10, m) * k[j - 1 - m];*(n + u) = h;//连续字符转换结果赋给整型数组nh = 0;u++;//记录已转换的整数个数j = 0;}elsej = 0;//每次转换后或者遇上非连续数字字符(只有1个)时,都要将计数器j置0}}return u;
}

运行结果:

 

本文标签: 输入字符串,将其中连续的数字字符分别以一个整数形式输出(谭浩强C语言第5版第8章习题16)