我正在学习C并编写一个简单的程序,它将假设每个二进制数为2个字符串值,并根据用户选择执行算术运算:
添加两个值,
从输入1减去输入2,或
将这两个值相乘.
我的实现假设字符串中的每个字符都是一个二进制位,例如char bin5 = "0101";
,但是一次解析字符串一个字符似乎太天真了.理想情况下,我希望直接使用二进制值.
在C中执行此操作的最有效方法是什么?有没有更好的方法将输入视为二进制值而不是scanf()
从字符串中获取每个位?
我做了一些研究,但从初学者的角度来看,我没有找到任何明显更好的方法.任何建议,将不胜感激!
忠告:
没有什么比一次在字符串中进行字符并确保用户只输入1和0更好.请记住,即使您可以编写一个非常快速的汇编例程,如果您认为一切都是1
或者0
,您实际上并不想这样做.用户可以输入任何内容,并且您希望能够告诉他们是否搞砸了.
确实,与可能需要添加实际数字的几个周期相比,这似乎令人难以置信地缓慢,但是如果你在纳秒或毫秒内得到你的答案真的很重要吗?无论如何,人类只能检测30毫秒的延迟.
最后,从用户获取输入并将输出写入屏幕比解析字符串或添加数字需要更长的时间,因此您的算法几乎不是瓶颈.保存您对实际计算密集型事物的优化:-).
你应该关注的是让任务减少人力.而且,事实证明有人已经为你做了这件事.
解决方法:
看看该strtol()
手册页:
long strtol(const char *nptr, char **endptr, int base);
这将允许您将任何基数中的字符串(nptr)转换为long.它也会检查错误.转换二进制字符串的示例用法:
#includechar buf[MAX_BUF]; get_some_input(buf); char *err; long number = strtol(buf, &err, 2); if (*err) { // bad input: try again? } else { // number is now a long converted from a valid binary string. }
提供基数2告诉strtol
转换二进制文字.