最高のパフォーマンスを得るには、関数への信頼できる入力と信頼できない入力を区別する必要があります。
たとえばgetBinNum()
、ユーザーからの入力を受け入れるような関数は、有効な文字をチェックし、圧縮して先頭のゼロを削除する必要があります。まず、汎用のインプレース圧縮関数を示します。
// General purpose compression removes leading zeroes.
void compBinNum (char *num) {
char *src, *dst;
// Find first non-'0' and move chars if there are leading '0' chars.
for (src = dst = num; *src == '0'; src++);
if (src != dst) {
while (*src != '\0')
*dst++ = *src++;
*dst = '\0';
}
// Make zero if we removed the last zero.
if (*num == '\0')
strcpy (num, "0");
}
次に、渡された値、または無効な場合は NULL を返すチェッカー関数を提供します。
// Check untested number, return NULL if bad.
char *checkBinNum (char *num) {
char *ptr;
// Check for valid number.
for (ptr = num; *ptr == '0'; ptr++)
if ((*ptr != '1') && (*ptr != '0'))
return NULL;
return num;
}
次に、入力関数自体:
#define MAXBIN 256
// Get number from (untrusted) user, return NULL if bad.
char *getBinNum (char *prompt) {
char *num, *ptr;
// Allocate space for the number.
if ((num = malloc (MAXBIN)) == NULL)
return NULL;
// Get the number from the user.
printf ("%s: ", prompt);
if (fgets (num, MAXBIN, stdin) == NULL) {
free (num);
return NULL;
}
// Remove newline if there.
if (num[strlen (num) - 1] == '\n')
num[strlen (num) - 1] = '\0';
// Check for valid number then compress.
if (checkBinNum (num) == NULL) {
free (num);
return NULL;
}
compBinNum (num);
return num;
}
追加または乗算する他の関数は、入力がこのライブラリ内の関数の 1 つによって作成されるため、入力が既に有効であると想定して作成する必要があります。質問とは関係がないため、コードは提供しません。
char *addBinNum (char *num1, char *num2) {...}
char *mulBinNum (char *num1, char *num2) {...}
ユーザーが 以外の場所からデータを取得することを選択した場合は、データを検証するgetBinNum()
ための呼び出しをユーザーに許可できます。checkBinNum()
あなたが本当に偏執的であるなら、ルーチンに渡されたすべての数値をチェックし、それに応じて行動する (NULL を返す) ことができますが、それには必要のない比較的高価なチェックが必要になります。