Title
输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。
Answer
The following code block is a kind of answer:
#include<stdio.h>
#include<stdlib.h>
int char2int(char *str,char* t);
int main(int argc,char const *argv[]){
char *str=NULL;
int n;
char* temp;
printf("Enter the designed number of chars:");
scanf("%d",&n);
str=(char*)malloc(n*sizeof(char));
gets(temp);
gets(str);
int i=char2int(str,temp);
if(*temp) printf("%d",i);
free(str);
return 0;
}
int char2int(char* str,char* t){
int num=0;
if(str[0]!='0'){
while(*str!='\0'){
if(*str>='0'&&*str<='9'){
num=(*str-'0')+num*10;
*t=1;
}else
{
printf("illegal number");
*t=0;
break;
}
str++;
}
}else
{
printf("illegal number");
*t=0;
}
return num;
}
Analysis
The title mainly test if you are familiar with C/C++ by design a task that transform characters to integers. Something worth being mentioned:
include 指令与头文件
#include <文件名>
表示在编译程序编译代码之前,预处理器在某些特定的目录中寻找指定的文件.找到该文件后,文件的内容将被插入到#include
指令所在的位置.头文件是一个文件,通常是源代码的形式,由编译器在处理另一个源文件的时候自动包含进来。通常被用来唯一指定接口,且多少提供一些文档来说明如何使用在该文件中声明的组件.头文件
系统文件也即头文件stdlib.h
包含函数malloc();string.h
;stdio.h
包含函数scanf()和gets().
###函数原型
如果程序中的函数调用语句出现在函数定义之前,或者调用另外一个文件的函数,那么应该写出函数的原型声明.函数原型的声明的一般形式如下:
类型名 函数名(类型名1 形参1,类型名2 形参2,…)
原型声明语句告诉编译程序该函数的返回值类型、接收的参数个数以及每个参数的类型,如:
int char2int(char* str,char* t);
该语句告诉编译程序char2int是一个函数的名字,该函数的返回值类型为int.char2int()函数接收两个参数,第一个参数的类型为char*
,即指向char型变量的指针变量;第二个同理.原型声明语句中的参数名称没有实际用途,可以省略,如:
int char2int(char* , char*);
主函数
main()
中的int型变量argc是字符串数组argv[]的长度;argv[]由argc个指向char型数据的指针元素组成,相当于一个二维字符串数组.const在*前决定了不能通过*argv[i]去修改值.
动态存储分配函数malloc()与释放函数free()
- 前者函数原型是
void* malloc(unsigned size)
Function: 在内存的动态存储去中分配一块连续空间,其长度为size.若申请成功,则返回指向所分配内存空间的起始地址的指针,且为void*
类型(通用指针);若申请内存空间不成功,则返回NULL(值为0).而在具体使用中,还需要将malloc()的返回值转换为特定指针类型,赋给一个指针,如:
str=(char*)malloc(n*sizeof(char));\
调用malloc()时,应该利用sizoef计算存储块大小,不要直接写数值,因为不同平台数据类型占用空间大小可能不同.
- 后者函数原型:
void free (void *ptr)
Funtion:除了一种情况下,释放由动态存储分配函数申请到的整块内存空间,ptr为要释放的首地址.如果ptr的值是空指针,则free什么都不做,这种情况单独存在为了配合初始化用NULL的习惯.该函数无返回值.free()应跟随malloc().
指针
char * str=NULL;
将str指针变量初始化为空指针,NULL在一般编译器中是ASCII值为0时的符号.
指针初始化是一种习惯.因为指针变量必须先赋值后引用.指针如果没有被赋值,它的值是不确定的,即它指向一个不确定的单元,使用这样的指针可能造成操作越界,甚至造成系统错误.不过需要注意不能用数值(除了0之外)作为指针变量的初值,因为地址本身是不便于直接被使用的,使用&
取变量地址可以.- 通过指针在函数中返回多个数值:
char2int(str,temp)
,实际形式为:
函数名(实参1,实参2)
这个表达式调用char2int()函数,并将str
与temp
作为地址参数,指针变量本身,也是字符串的首地址传递给该函数.函数的参数传递按照值引用的方式进行,函数内部的局部变量在出去函数时会被销毁掉,只会有返回值幸存.但是如果给函数传递一个指针参数,就可以在函数内部对该指针指向的位置上面的数据进行修改,尽管不能对实际的指针进行修改,但是实现了一个函数返回多个数值.
3. 通过指针的递增实现对字符串元素的遍历:str++
,str+1代表访问的是下一个变量的内存地址,故*(str+1)为字符串中下一个的变量.