C程序设计 (第四版) 谭浩强 习题8.16
习题 8.16 输入一个字符串,内有数字和非数字字符,例如:
A123x456 17960? 302tab5876
将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123放在a[0],456放在a[1]。。。。。。统计共有多少个整数,并输出这些数。
IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块
方法1:使用指针,数组
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void output(char *s, int n); //定义输出函数
int main(){
char str[30];
printf("Please enter string: "); //输入字符串
gets(str);
output(str, 30); //调用输出函数
system("pause");
return 0;
}
//输出函数
void output(char *s, int n){
char *i;
int j, k, t, m, temp[10], num;
double sum, a[30];
for(i = s, num = 0, j = 0, m = 0; i < s + n; i++)
if(*i >= '0' && *i <= '9') num = 1, temp[j++] = (int)(*i-'0');
else if (num){
for(num = 0, k = 0, sum = 0, t = j - 1; k < j; sum += temp[k] * pow(10, t), t--, k++);
a[m++] = sum, j = 0;
}
for(j = 0, printf("There is %d number in the string.\nResult: ", m); j < m; printf("%.0f ", a[j++]));
printf("\n");
}
方法2:使用指针,动态分配内存
#include <stdio.h>
#include <stdlib.h>
#define N 80
void initialStr(char **str, int n){
*str = (char*)malloc(n *sizeof(char));
}
void inputStr(char *str){
printf("Enter string: ");
gets(str);
}
void countNum(char *str, int n){
int *num = (int*)malloc(n * sizeof(int));
int sign = 0;
int i, j, k;
int sum = 0;
for(i = 0, j = 0; str[i] != '\0'; i++){
if(str[i] >= '0' && str[i] <= '9'){
sign = 1;
sum = sum * 10 + (str[i] - '0');
}
else if(sign == 1){
num[j++] = sum;
sign = 0;
sum = 0;
}
if(sign == 1 && str[i+1] == '\0'){
num[j++] = sum;
sign = 0;
sum = 0;
}
}
printf("Total Number: %d\n", j);
for(k = 0; k < j; k++){
printf("%d ", num[k]);
}
printf("\n");
}
int main(){
char *str = NULL;
initialStr(&str, N);
inputStr(str);
countNum(str, N);
free(str);
system("pause");
return 0;
}