阳台煮酒

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

      总在想,但凡编程基础正常点,都不至于惨败到这个地步。也像大多数人毕业出来,新鲜的第一份工作,如果做得好还可以略有成就感,做得一般还有提升的空间,但至少不至于像我这样基本没基础的被鄙视得一塌糊涂,被外界持续的否定,再加上经历了一些比较深刻的事,直到你也开始觉得,你存在的意义何在?可是这又怎样呢?事实已经如此了,那就努力改善!没有假如,没有如果,没有任何人可以替你来努力。今天去看了赵星的微博,很励志。有一段话藉以共勉:人总要付出很大努力才会让别人觉得毫不费力,世上没有白挣的钱,没有白付出的辛苦,只有没下够的功夫和没坚持的勇气,而功夫下在哪里,努力放在了什么地方,都是可以直接看得见的。

一.题目:下面程序实现如下功能:输入一个整数字符串转换为一个整值,”1234”1234”-1234”转  

        换-1234

二.思路: 定义一个数组用来存放输入字符串

              输入整数字符串(加判断条件,确定是数字字符串)

              将字符串转换为int型整数值

三.程序:

 1  #include <stdio.h>
 2  #include <string.h>
 3  
 4  #define SIZE 64
 5  int main(void)
 6  {
 7      char String[SIZE] = {0};
 8      int  Number[SIZE] = {0};
 9      int nStart = 0;
10      int i,j;
11  
12      printf("please input the string :\n");
13      gets(String);
14      //判断字符串是否带有负号
15      if(String[0] == '-')
16      {
17         nStart = 1;//如果是负数,则从字符数组第二个元素开始转换
18      }
19      else
20         nStart = 0;//如果是正数,则将字符数组直接转换
21 
22      //将字符串转换成数字,正负号不参与整型数组的存储,故j从0开始
23      for(i=nStart,j=0;String[i];i++,j++)
24      {
25         Number[j] = String[i] - '0' ;
26      }
27      //判断是不是负号,打印出来
28      printf("%c",String[0]);
29      for(j=0;Number[j];j++)
30      {
31        printf("%d",Number[j]);
32      }
33      
34      return 0;
35  }

 

四.编译运行

五.分析问题

    1.运行的结果看上去是想要的

      仔细一想,不对,这只是按照想要的结果方式打印出来了,其实并没有真正实现字符串转化成整型数据,

      而是利用%s将正负号打印出来而已,更何况整型数据竟然是存在数组里,编程的时候还在纠结正负号到

      底放在第几个元素,搞笑,题目要求的是将字符串转换为一个整型数字!是数字!

    2.那么,正负号的问题怎么解决呢?

       别忘了,你定义数字的时候用int类型,它本身就是带符号的,根据你输入字符串的正负号,在数字前面      

       加个正负号就行啦~

      

    3.不是说好了要加判断条件以确保是数字字符串吗?可是在输入时用gets()或者是scanf()怎么样才可

       以加以判断嘛?

       在输入的时候我们当然没办法来阻止非数字字符的输入,但是可以在转换成整数的过程中判断啊,傻了吧

       ~

       

六.改进

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define SIZE 64
 5 
 6 int main(void)
 7 {
 8     char String[SIZE] = {0};
 9     int  Number = 0;
10     int  nStart = 0;
11 
12     printf("please input the string :\n");
13     gets(String);
14     //判断字符串是否带有负号
15     if(String[0] == '-')
16        nStart = 1;//如果是负数,则从字符数组第二个元素开始转换
17     else
18        nStart = 0;//如果是正数,则将字符数组直接转换
19     //将字符串转换成数字
20     for(int i=nStart;String[i];i++)
21     { 
if(String[i]>'0' && String[i]>'9')
22 Number = Number*10 + (String[i] - '0') ; 23 } 24 //判断是不是负号, 25 if(nStart == 1) 26 Number = -Number;//如果负数,则把负号添加给Number 27 printf("the number is :\n"); 28 printf("%d",Number); 29 return 0; 30 }

七.编译运行

 八.网上解答版本

 

 1   #include<stdio.h>
 2   #include<string.h>
 3   int main(void)
 4   {
 5           char s[60];
 6           int n;
 7           long chnum(char *p);
 8           gets(s);
 9           if (*s=='-')  n=-chnum(s+1);
10           else  n=chnum(s);
11           printf("%d\n",n);
12           return 0; 
13   }
14   long chnum(char *p)
15   {
16       long sum=0;
17       while(*p)
18       {
19           if(*p>='0'&&*p<='9')
20               sum=sum*10+*p-'0';
21           p++;
22       }
23       return sum;
24   }

 

   相比之下,网上这种解法更加高大上,第一在于封装了那个转换函数,第二在于充分运用了指针和数组的关系,将

   数组名当做指针来用。模仿这种方法,自己也练了一下

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define SIZE 64
 5 
 6 //转换函数,将字符串转换成整型值
 7 int StrToInt(char *p)
 8 {  
 9     int sum = 0;
10     while(*p)
11     {
12        if(*p>'0' && *p<'9')
13            sum = sum*10 + *p-'0';
14        p++;    
15     }
16     return sum;//返回整型值
17 }
18 
19 int main(void)
20 {
21     char String[SIZE] = {0};
22     int  Number = 0;
23     int  nStart = 0;
24 
25     printf("please input the string :\n");
26     gets(String);
27 
28     if(*String == '-')//判断是否是负数
29         Number = -StrToInt(String+1);//如果是负数,从字符串数组第二个元素作为参数开始传入,并在数字                                           前加负号
30     else
31         Number = StrToInt(String);//如果是正数,把字符串数组直接作为参数传入
32     printf("the number is :\n");
33     printf("%d",Number);
34     return 0;
35 }

十.知识点:

   1.字符串输入专题

    1)gets()函数

    2)fgets()函数

    3)scanf()函数

   3.数组和指针的关系

    

 

     

posted on 2014-05-11 00:00  阳台煮酒  阅读(331)  评论(0编辑  收藏  举报