C/C++校招笔试面试经典题目总结七
来源:互联网 发布:java获取上个月第一天 编辑:程序博客网 时间:2024/06/05 11:26
题目71:实现strtol函数,其原型如为unsigned int strtoul(const char *cp, char **endp, unsigned int base),num_str存放待转换的字符串,可以是负数也可以是正数;endptr指向第一个非法字符的地址,如果endptr为null则不指向第一个非法字符的地址;base用于指示进制,若base为0,则根据num_str的指示来转换。函数必须检查溢出,如果正数溢出,返回int_max;若负数溢出,返回int_min。
解析:这道题目是迅雷C++笔试的编程大题,与atoi函数的实现又稍有区别。atoi函数的实现有如下要点:(1)检查非法输入;(2)检查溢出;实现如下:
#include "stdafx.h"#include <stdio.h>#include <stdlib.h>long long StrToIntCore(const char* str, bool minus);enum Status {kValid = 0, kInvalid};//设置全局变量,空字符''和‘0’都返回的0,但前者设置全局变量的值与后者加以区分int g_nStatus = kValid;int StrToInt(const char* str){ g_nStatus = kInvalid; long long num = 0; if(str != NULL && *str != '\0') { bool minus = false; if(*str == '+')//符号判断 str ++; else if(*str == '-') { str ++; minus = true; } if(*str != '\0') { num = StrToIntCore(str, minus); } } return (int)num;}long long StrToIntCore(const char* digit, bool minus){ long long num = 0; while(*digit != '\0') { if(*digit >= '0' && *digit <= '9') { int flag = minus ? -1 : 1; num = num * 10 + flag * (*digit - '0'); if((!minus && num > 0x7FFFFFFF) || (minus && num < (signed int)0x80000000))//溢出检查 { num = 0; break; } digit++; } else { num = 0; break; } } if(*digit == '\0') { g_nStatus = kValid; } return num;}然而迅雷的这道编程题,与上边的又有些许区别,加入了进制的考查。
#define TOLOWER(x) ((x) | 0x20) #define isxdigit(c) (('0' <= (c) && (c) <= '9') / || ('a' <= (c) && (c) <= 'f') / || ('A' <= (c) && (c) <= 'F')) #define isdigit(c) ('0' <= (c) && (c) <= '9') unsigned long strtoul(const char *cp,char **endp,unsigned int base) { unsigned long result = 0,value; if (!base) { base = 10; if (*cp == '0') { base = 8; cp++; if ((TOLOWER(*cp) == 'x') && isxdigit(cp[1])) { cp++; base = 16; } } } else if (base == 16) { if (cp[0] == '0' && TOLOWER(cp[1]) == 'x') cp += 2; } while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : TOLOWER(*cp)-'a'+10) < base) { result = result*base + value; cp++; } if (endp) *endp = (char *)cp; return result; } long strtol(const char *cp,char **endp,unsigned int base) { if(*cp=='-') return -strtoul(cp+1,endp,base); return strtoul(cp,endp,base); } INT32S atoi(const INT8S *nptr)// { return strtol(nptr, ( INT8S **)NULL, 10); }
明天继续更新,去吃饭喽..
0 0
- C/C++校招笔试面试经典题目总结七
- C/C++校招笔试面试经典题目总结一
- C/C++校招笔试面试经典题目总结二
- C/C++校招笔试面试经典题目总结三
- C/C++校招笔试面试经典题目总结四
- C/C++校招笔试面试经典题目总结五
- C/C++校招笔试面试经典题目总结六
- C/C++校招笔试面试经典题目总结八
- C/C++校招笔试面试经典题目总结九
- C/C++校招笔试面试经典题目总结十
- C/C++ 笔试、面试题目总结,
- 总结:WHUACM 2007暑假招新笔试(附原题,有许多经典的面试题目)
- C/C++笔试经典题目
- C/C++ 笔试、面试题目
- C/C++ 笔试、面试题目
- C/C++ 笔试面试题目
- C/C++笔试面试题目
- 校招【 笔试面试 】准备之C语言 基础知识一
- ScaleToFit 图片如何填充屏幕
- 向网页中添加 特定位置的地图
- equals和==的区别
- Java语言系列02——Lexical Grammar (词法)介绍
- Shiny应用基础(1):导言
- C/C++校招笔试面试经典题目总结七
- [AD]域中系列改名问题收集
- swift 自定义view的写法(内有仿照OC中block的 swift闭包的调用)
- 十大编程算法
- web.xml
- python getopt使用
- Error creating object Please verify that the Microsoft Data Access Components 2.1 (or later) have be
- 百万数据查询优化
- mybatis数据库组合查询技巧