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;
}