面试题-基础-字符串转整数&字符串拷贝函数

做了一些面试题,有一些是很基础的编程题,如果不假思索的就直接上手写代码的话,如果不是大牛,很可能就栽倒陷阱里了。

其实并不是说题目有多么难,而是作为一个程序员,能不能体现你的思维缜密,考虑问题的全面性。(这样讲的话,一份试题真的能考到心态和能力)

下面是自己写的字符串转换为整数的函数,考虑了五种不同的情况

/*
---------字符串转换为整数(类似与atoi函数)------------
描述:程序本没有那么复杂,如果只是简单的其实不到10行就可以搞定,但是要考虑不同的情况的话,就稍微复杂点。
	下面只考虑了简单的五种情况,如果需要添加额外的考虑,可以另行修改代码。
	比如“++123 ”也认为是整数,可以转换为123,那么就需要稍微变一下(下述并没有考虑,这种情况直接为0处理) 
time:2013.09.14 
author: stefen.s
*/
#include <iostream>
#include <stdlib.h>
using namespace std;
void StrToInt(const char *str)
{
	//-----第一种情况:str为null 
	if(str == NULL)
	{
		cout<<"string is null."<<endl;
		return;
	}
	//-----第二种情况:str为"" 
	int count = strlen(str);
	if(count<1)
	{
		cout<<"invalid string."<<endl;
		return;	
	}
	
	int sign = 1;	//默认为正数,符号标量为1
	//-----第三种情况:str的第一项为符号“+ ” 或者“- ” 
	sign = ('-' == str[0]?-1:1);	
	
	int num = 0;
	for(int i = 0;i<count;i++)
	{
		int temp = str[i] - 0x30;
		//-----第四种情况:存在其他字符在数字中间的情况,只保留该字符前面的数字为所取的数字 
		if(i>=1 && (temp < 0 || temp > 9))
			break;
		//-----第五种情况:正常情况(包括“000123 ”这种前面有很多零的情况 
		if(temp >=0 && temp <= 9)
			num = temp + num * 10;
	}
	
	cout<<"String to integer is : "<<(num * sign)<<endl;
}

int main()
{
	char * str = "++123456";
	StrToInt(str);
	//-----和atoi进行对比 
	cout<<"atoi: "<<atoi(str)<<endl;
	return 0;
}

接下来是字符串拷贝函数,同样考虑了五种不同的情况。比较容易忽略的是第四种情况

char *StrCpy(char *to,const char * src)
{
	//------第一种情况,src为null 
	assert(to != NULL && src != NULL);
	char *d = to;
	
	int count = strlen(s) + 1;	//保证将最后的'\0'也复制上
	//-----第二种情况,src = "" 
	if(count<1)
	{
		cout<<"Empty string."<<endl;
		return; 
	}
 	//-----第三种情况,d==src
 	if(d ==src) 
 		return d;
	//-----第四种情况,d在src和src+count之间-----这种情况容易忽视 
	if(d > src && d <=(src + count))
	{
		d = to + count;
		src = src + count;
		while(count--)
			*d-- = *src--;	
	}
	//-----第五种情况,d<src或者d>src + count 
	else
		while((*d++ = *src++) != '\0');
		
	return to;	//注意返回值
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值