该函数被发送一个以空字符结尾的字符数组,其中每个字符代表一个十进制(以 10 为基数)数字。该函数返回一个整数,它是字符的基数 10 表示。
我将简要提到一个事实,“作为字符的基数 10 表示的整数”在这里是无用的,整数将表示值,而“基数 10 表示”是所述值的表示。
然而,给出的描述仅仅意味着你接受一个(C风格的)数字字符串并输出一个整数。所以你会开始:
int convertCtoD(char *decimalString) {
int retVal = 0
// TBD: needs actual implementation.
return retVal;
}
该函数被发送一个以空字符结尾的字符数组,其中每个字符代表一个二进制(以 2 为基数)数字。该函数返回一个整数,它是字符的基数 10 表示。
这将非常相似:
int convertBtoD(char *binaryString) {
int retVal = 0
// TBD: needs actual implementation.
return retVal;
}
您会注意到,即使根本不需要处理带符号的值,我也将返回类型保留为带符号的。您将在下面提供的示例实现中看到为什么我使用它来返回错误条件。即使您没有要求我提供代码的原因是我认为五年多的时间足以确保您不能通过将我的代码作为您自己的代码来作弊:-)
也许最简单的例子是:
int convertCToD(char *decimalStr) {
// Initialise accumulator to zero.
int retVal = 0;
// Process each character.
while (*str != '\0') {
// Check character for validity, add to accumulator (after
// converting char to int) then go to next character.
if ((*str < '0') || (*str > '9')) return -1;
retVal *= 10;
retVal += *str++ - '0';
}
return retVal;
}
二进制版本基本上是相同的,只是它将'1'
用作上限和2
乘数(与'9'
and相对10
)。
这是最简单的形式,但还有很大的改进空间,可以使您的代码更加健壮和可读:
- 由于这两个功能非常相似,您可以重构出公共位以减少重复。
- 您可能希望将空字符串视为无效,而不是像当前那样仅返回零。
- 您可能希望将溢出检测为错误。
考虑到这些,以下可能是更强大的解决方案:
#include <stdbool.h>
#include <limits.h>
int convertBorCtoD(char *str, bool isBinary) {
// Configure stuff that depends on binary/decimal choice.
int maxDigit = isBinary ? '1' : '9';
int multiplier = maxDigit - minDigit + 1;
// Initialise accumulator to zero.
int retVal = 0;
// Optional check for empty string as error.
if (*str == '\0') return -1;
// Process each character.
while (*str != '\0') {
// Check character for validity.
if ((*str < '0') || (*str > maxDigit)) return -1;
// Add to accumulator, checking for overflow.
if (INT_MAX / multiplier < retVal) return -1;
retVal *= multiplier;
if (INT_MAX - (*str - '0') < retVal) return -1;
retVal += *str++ - '0';
}
return retVal;
}
int convertCtoD(char *str) { return convertBorCtoD(str, false); }
int convertBtoD(char *str) { return convertBorCtoD(str, true); }