C提取数字

输入一个字符串,内有数字和非数字字符,如A123 456×17960? 302ta309*dal201n320将其中连续的数字作为一个整数,并输出这些数. 有什么简单的方法? 急!!! 

#include <stdio.h>
main()
{
char str[50], *pstr;
int i,j,k,m,e10,digit,ndigit,a[10],*pa;
printf("Input a string: \n");
gets(str);
printf("\n");
pstr=&str[0]; /* 字符指针pstr置于数组str首地址*/
pa=&a[0]; /* 指针pa置于数组a首地址*/
ndigit=0; /* ndigit代表有多少个整数*/
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; /*e10代表该位数所应乘的因子*/
digit=digit+(*(pstr+i-1-k)-48)*e10; /*将该位数的数值累加于digit*/
k++; /*位数k自增*/
}
*pa=digit; /*将数值赋予数组a*/
ndigit++;
pa++; /*指针pa指向a数组下一元素*/
j=0;
}
}
i++;
}
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; /*e10代表该位数所应乘的因子*/
digit=digit+(*(pstr+i-1-k)-48)*e10; /*将该位数的数值累加于digit*/
k++; /*位数k自增*/
}
*pa=digit; /*将数值赋予数组a*/
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");
}

为什么
digit=*(pstr+i-1)-48; /*将个数位赋予digit */

要-48???为什么是48
减了48为什么就是 数字的0呢?
再多问一个。。。
数字的0 的编码是 0?不是48?

ASCII码 键盘 ASCII 码 键盘 ASCII 码 键盘 ASCII 码 键盘
27 ESC 32 SPACE 33 ! 34 "
35 # 36 $ 37 % 38 &
39 ' 40 ( 41 ) 42 *
43 + 44 ' 45 - 46 .
47 / 48 0 49 1 50 2
51 3 52 4 53 5 54 6
55 7 56 8 57 9 58 :
59 ; 60 < 61 = 62 >
63 ? 64 @ 65 A 66 B
67 C 68 D 69 E 70 F
71 G 72 H 73 I 74 J
75 K 76 L 77 M 78 N
79 O 80 P 81 Q 82 R
83 S 84 T 85 U 86 V
87 W 88 X 89 Y 90 Z
91 [ 92 \ 93 ] 94 ^
95 _ 96 ` 97 a 98 b
99 c 100 d 101 e 102 f
103 g 104 h 105 i 106 j
107 k 108 l 109 m 110 n
111 o 112 p 113 q 114 r
115 s 116 t 117 u 118 v
119 w 120 x 121 y 122 z
123 { 124 | 125 } 126 ~

所以从字符'0'转换成数字0需要减48,当然建议将48换成'0',digit=*(pstr+i-1)-'0'; 这样比较容易理解

输入一个字符串,内有数字和非数字字符,例如

A123x456 1789?302TAB5876

将其中连续的数字作为一个整数,依次存放到一数组a中,如123放在a[0],456放在a[1]中;

#include<stdio.h>
int main()
{
 int i,j,k,digit,ndigit,e10,m,a[10],*pa;
 char str[50],*pstr;
    printf("please input string:/n");
 gets(str);

 pa=&a[0];
 pstr=&str[0];
 ndigit=0;
 i=0;
 j=0;
 while(*(pstr+i)!='/0')
 {   //忘记写=等于号了,应该是">="
  if((*(pstr+i)>='0')&&(*(pstr+i)<='9'))//刚开始以为要用while;其实用if效果一样;注意相与的时候要加括号
   j++;
  else//注意else作用域是下面这个花括号;不包括i++;
  {
   if(j>0)
   {   //将个位数赋予digit;
    digit=*(pstr+i-1)-48;//0~9的ascii码是30h~39h;减去48将它变为十进制;
    k=1;//k个位数
    while(k<j)
    {
     e10=1;//该位数所应乘的因子;
     for(m=1;m<=k;m++)//k如果大于2;计算e10的因子;
      e10=e10*10;
     digit=digit+(*(pstr+i-1-k)-48)*e10;//将十位百位数的数字乘以e10;
     k++;//数位k自增;
    }
    *pa=digit;//将数值赋予数组a;
    ndigit++;
    pa++;//指针pa指向a数组下一元素;
    j=0;//一个数结束;初始j=0;
   }
  }
   i++;
 }
   printf("this string total have %d digit/n",ndigit);
   pa=&a[0];//如果没有重新赋值pa指向a首地址;输出值就不正确;因为pa值变化了,所以需要重新赋值;
   for(j=0;j<ndigit;j++)//总共有ndigit个数字个数;所以j<ndigit;
    printf("%8d",*(pa+j));//如果%4d因为不够宽,输出的两个数字连在一起了;
   printf("/n");
   return 0;
}
 

posted @ 2013-05-13 17:38  herizai  阅读(559)  评论(0编辑  收藏  举报