• C语言每日一题之No.5


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

    一.题目:下面程序实现如下功能:输入一个整数字符串转换为一个整值,”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 :
    ");
    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 :
    ");
    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 : "); 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);
    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 :
    ");
    26     gets(String);
    27 
    28     if(*String == '-')//判断是否是负数
    29         Number = -StrToInt(String+1);//如果是负数,从字符串数组第二个元素作为参数开始传入,并在数字                                           前加负号
    30     else
    31         Number = StrToInt(String);//如果是正数,把字符串数组直接作为参数传入
    32     printf("the number is :
    ");
    33     printf("%d",Number);
    34     return 0;
    35 }

    十.知识点:

       1.字符串输入专题

        1)gets()函数

        2)fgets()函数

        3)scanf()函数

       3.数组和指针的关系

        

         

  • 相关阅读:
    快乐前端-图片预加载
    浅谈canvas绘画王者荣耀--雷达图
    浅谈CSS3动画的凌波微步--steps()
    车大棒浅谈jQuery源码(二)
    车大棒浅谈jQuery源码(一)
    车大棒浅谈for循环+canvas实现黑客帝国矩形阵
    浅谈JavaScript 函数作用域当中的“提升”现象
    清除浮动塌陷的4种经典套路
    可以看电影的微信公众号
    Mac安装protobuf编译Java
  • 原文地址:https://www.cnblogs.com/TTTTT/p/3721230.html
Copyright © 2020-2023  润新知