单位: 武汉智能控制工业技术研究院
主要的工作内容是新能源汽车,船等的嵌入式开发。 唯一的条件是:熟悉 C 语言。能完成下面这个简单的面试题:
写一个函数 int str2int(char * s) 把字符串返回为 int , 如果输入不是数字字符串,返回 0
譬如
"99" -> 99
"-123" -> -123
"78Hello" -> 78
"Hello" -> 0
"72.35" -> 72
"-66-abc" -> -66
"abc-66" -> 0
"2****2" -> 2
注意: 无论输入任何字符串,这个程序都不应当崩溃。如果输入出现异常(譬如输入是一个"hello"字符串) ,则返回 0 。输入可能是任意 char *, 返回值必须是 int , 请仔细考虑 .
这个题目很简单,请用标准 C 做, 需要考虑各种异常情况 , 难点在于你是否考虑了足够的异常情况
不需要加班,双休
简历发送至公司 email:aHVhbmdib0BpY2l3aC5jb20= ( base64 编码) 如果公司 email 因为垃圾邮件设置发送失败,就发到: MTQ4ODIzNjdAcXEuY29t
1
chingyat 2023-11-03 19:31:20 +08:00 via iPhone
输入的数字都当作十进制吗?以 0 开头的话怎么算?
|
2
lykhero 2023-11-03 20:10:14 +08:00
atoi
|
3
2532937079mao 2023-11-03 20:27:43 +08:00
待遇咋样?
|
4
nuk 2023-11-03 20:43:55 +08:00
感觉可以考虑的范围就是检查指针,检查溢出,检查字符串长度,atoi 不会检查字符串长度,在嵌入式里面还是可能会卡 watchdog 吧
|
5
gof817 2023-11-03 21:30:01 +08:00
虽然觉得这种直接把题发出来都是钓鱼的。。我用了 IDE 提示写的,现场用笔徒手写在纸上才是猛人
```c #include <stdlib.h> #include <ctype.h> #include <string.h> int str2int(char *s) { if (s == NULL) { return 0; } int sign = 1; int result = 0; int i = 0; // 判断字符串是否为空 if (strlen(s) == 0) { return 0; } // 判断字符串是否以 '-' 开头,如果是则设置符号为负数 if (s[0] == '-') { sign = -1; i++; } // 遍历字符串,将数字字符转换为整数并累加 while (isdigit(s[i])) { int digit = s[i] - '0'; if (result > INT_MAX / 10 || (result == INT_MAX / 10 && digit > 7)) { return 0; } result = result * 10 + digit; i++; } return result * sign; } ``` |
6
iOCZ 2023-11-03 21:42:42 +08:00
可能用状态机代码会好看一些
|
7
rimworld 2023-11-04 09:42:11 +08:00 via iPhone
@gof817 还可以写个 26 个大小写英文字母数组。首个字符在这里面,就可以直接 return 0 了。
|
8
gof817 2023-11-04 11:46:10 +08:00
@rimworld 那样太麻烦了,还有很多符号啊中文之类的要处理,这里直接用了标准库的 isdigit 。
如果不想用标准库,那自己写直接判断 ascii 码范围就行。 就这样. 伪代码 `s[i] - '0' < 10u` 当前的 ascii 码减去字符'0'的 ascii 码,如果差值在 10 以内就说明是个数字的 ascii 码。这样不需要申请数组的内存,也不需要遍历,只要简单的数学运算就行。 |
9
VisualStudioCode 2023-11-04 22:28:47 +08:00
'-03'的预期输出是什么?
|
10
handsome11 2023-11-06 10:32:42 +08:00
武汉有几个人听过 V2EX ?瞎折腾吧
|