
单位: 武汉智能控制工业技术研究院
主要的工作内容是新能源汽车,船等的嵌入式开发。 唯一的条件是:熟悉 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 ?瞎折腾吧 |