Linux C 指针练习

题目一

已知数组内容如下 s[] = {1,2,3,4,5,6,7,8,9},输入一个常数 m(1<=m<=9),使得该数组内容顺序后移n个位置。如n = 3时,数组后移3个位置后的内容为{7,8,9,1,2,3,4,5,6}

代码如下:

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     int a[] = {1,2,3,4,5,6,7,8,9};  
  6.     int b[9] = {0};  
  7.     int *p = a;   
  8.     int *q = b;  
  9.     int i,m,n;  
  10.   
  11.     printf("请输入要移动的位数:\n");  
  12.     scanf("%d",&m);  
  13.     n = m;  
  14.       
  15.     for(i = 0; i < m; i++)     
  16.     {  
  17.         *q++ = *( p + 9 - n);  
  18.         n--;      
  19.     }  
  20.       
  21.     for (i = 0;i < 9 - m;i++)          
  22.         *q++  = *p++;  
  23.   
  24.     printf("移动后数组为:\n");  
  25.     for(i = 0; i < 9;i++)  
  26.         printf("%d ",b[i]);   
  27.         printf("\n");  
  28.       
  29.     return 0;  
  30.   
  31. }  
执行结果如下:
[cpp]  view plain  copy
  1. fs@ubuntu:~/qiang/tmp$ ./zhizhen2  
  2. 请输入要移动的位数:  
  3. 3  
  4. 移动后数组为:  
  5. 7 8 9 1 2 3 4 5 6   
  6. fs@ubuntu:~/qiang/tmp$ ./zhizhen2  
  7. 请输入要移动的位数:  
  8. 7  
  9. 移动后数组为:  
  10. 3 4 5 6 7 8 9 1 2   
  11. fs@ubuntu:~/qiang/tmp$   


题目二、

输入一个字符串,内有数字和非数字字符,如a123X456  17960? 302tab5876 将其中连续的数字作为一个整数,一次存放到整数型数组a中,例如123放到 a[0],456放到 a[1]中,统计有多少个整数,并输出这些数;

分析:这是一道非常经典的指针编程题,网上有很多解法,有用malloc的,有用sscanf的,找到一个自己能理解的解法也是重要的,下面是博主自己写的程序,希望对大家有所帮助,代码如下:

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. int main(int argc, const char *argv[])  
  5. {  
  6.     char b[100];  
  7.     int  a[100];  
  8.     memset(a,'\0',100);  
  9.     char *p = b;  
  10.     int i = 0;  
  11.     int j;  
  12.     int sum = 0;  
  13.     int count = 0;  
  14.     int flag = 1;//标志位,遇到数字为0,遇到非数字为1;此处其初始值为1,默认首字符前面还是非数字,不输出整数,主要配合下面的程序  
  15.     printf("请输入字符串:\n");  
  16.     gets(b);  
  17.       
  18.     while(*p )  
  19.     {  
  20.         if(*p <= '9' && *p >= '0')  
  21.         {  
  22.             flag = 0;//遇到数字,flag=0  
  23.             sum = sum*10 + *p++ - '0';//将字符数字转化成整数,此时并不输出。当下一个字符为非数字时,才输出  
  24.         }     
  25.         else   
  26.         {  
  27.             while(flag == 0)//此时读到非数字字符,判断此时flag,如果此时flag为0.说明上一个字符为数字  
  28.             {  
  29.                 a[i++] = sum ;//此时将数字输出,赋给a[i],i++  
  30.                 sum = 0;//将sum清零  
  31.                 flag = 1;//非数字字符,flag置1  
  32.             }  
  33.             p++;//此时flag为1,没有整数输出,则看下一个字符  
  34.         }  
  35.     }  
  36. //字符串结束后,会遇到两种情况,一个是最后一个字符为数字,另一种是非数字字符  
  37.     if(flag == 0)//因为前面的程序中,整数的下一个字符为非数字时,才会输出整数,若最后一个是数字的话,则无法输出,所以这里对最后一个字符进行判断  
  38.         a[i] = sum;//将最后一个整数输出  
  39.     else   
  40.         i--;//此时最后一个字符为非数字,没有整数输出,但i多加了一次,所以此处i--  
  41.       
  42.     count = i + 1;//整数个数为i+1  
  43.     printf("共有%d个整数\n",count);  
  44.     printf("这些整数是:\na[]=");  
  45.     for(j = 0; j < i+1; j++)  
  46.         printf("%d ",a[j]);  
  47.     printf("\n");  
  48.   
  49.     return 0;  
  50. }  

 
输出结果为: 
[cpp]  view plain  copy
  1. fs@ubuntu:~/qiang/tmp$ ./zhizhen1  
  2. 请输入字符串:  
  3. 123xiao45  ?<er97  
  4. 共有3个整数  
  5. 这些整数是:  
  6. a[]=123 45 97   
  7. fs@ubuntu:~/qiang/tmp$ ./zhizhen1  
  8. 请输入字符串:  
  9. xiao12jian5w4gd67dd  
  10. 共有4个整数  
  11. 这些整数是:  
  12. a[]=12 5 4 67   
  13. fs@ubuntu:~/qiang/tmp$   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值