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