zoukankan      html  css  js  c++  java
  • 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;
    }
     

  • 相关阅读:
    同一个人
    11.13作业第十一次AB类
    实类化对象
    字符串数组 输入3个字符串,要求按由小到大的字母顺序输出; 输入n个学生的姓名和学号到字符串数组中,在输入一个姓名,如果班级有该生则返回其信息,否则返回本班无此人
    字符数组
    作业:例题5.7 用选择法对数组中10个整数按由小到大排序。要求使用函数的方法。
    有一个3*4的矩阵,编程求出其中最大值,以及其所在的行号和列号。
    函数重载
    冒泡数组
    裴波那契数列
  • 原文地址:https://www.cnblogs.com/herizai/p/3076156.html
Copyright © 2011-2022 走看看