只允许八进制数
Only allowing octal numbers
我的代码做的是:
- 用户选择从十进制到八进制或八进制到十进制的转换。
- 用户输入一个数字
- 用户获取转换结果
现在我只想在从八进制转换为十进制时允许使用八进制数字,如果数字不是八进制,则给出错误消息。
如何实现?
#include <stdio.h>
#include <math.h>
int UmrechnungDezimalZuOktal(int dezimalzahl), UmrechnungOktalZuDezimal(int oktalzahl);
int main()
{
char auswahl;
int dezimalzahl, oktalzahl, nichtBeendet = 1, c;
while (nichtBeendet) {
printf("\n\n ################## AUSWAHL ##################\n"
" # #\n"
" # 1) Konvertierung Dezimal -> Oktal #\n"
" # 2) Konvertierung Oktal -> Dezimal #\n"
" # 3) Abbruch #\n"
" # #\n"
" ###############################################\n\n");
printf("Auswahl: ");
scanf("%c", &auswahl);
switch (auswahl) {
case '1': { /* Konvertierung Dezimal -> Oktal */
printf("Geben Sie eine positive, ganze Dezimalzahl ein: ");
scanf("%d", &dezimalzahl);
if (dezimalzahl >= 0)
{
printf("Die Dezimalzahl %d entspricht der Oktalzahl %d", dezimalzahl, UmrechnungDezimalZuOktal(dezimalzahl));
}
else
{
printf("Bitte nur positive Zahlen eingeben!");
}
break;
}
case '2': { /* Konvertierung Oktal-> Dezimal */
printf("Geben Sie eine positive, ganze Oktalzahl ein: ");
scanf("%d", &oktalzahl);
if (oktalzahl >= 0)
{
printf("Die Oktalzahl %d entspricht der Dezimalzahl %d", oktalzahl, UmrechnungOktalZuDezimal(oktalzahl));
}
else
{
printf("Bitte nur positive Zahlen eingeben!");
}
break;
}
case '3': { /* Abbruch */
nichtBeendet = 0;
break;
}
default: { /* Ungültige Eingabe*/
printf("Ungueltige Eingabe!");
break;
}
}
while ((c = getchar()) != '\n' && c != EOF) {};
}
}
int UmrechnungDezimalZuOktal(int dezimalzahl) /* Rechnung Dezimal -> Oktal */
{
int oktalzahl = 0, i = 1;
while (dezimalzahl != 0)
{
oktalzahl += (dezimalzahl % 8) * i;
dezimalzahl /= 8;
i *= 10;
}
return oktalzahl;
}
int UmrechnungOktalZuDezimal(int oktalzahl) /* Rechnung Oktal -> Dezimal*/
{
int dezimalzahl = 0, i = 0;
while (oktalzahl != 0)
{
dezimalzahl += (oktalzahl % 10) * pow(8, i);
++i;
oktalzahl /= 10;
}
i = 1;
return dezimalzahl;
}
我会用 fgets
和 strtol
:
替换所有 scanf
和硬编码函数
enum {oct = 8, dec = 10, hex = 16};
int to_number(int base, bool *match)
{
char str[32];
long num = 0;
*match = false;
if (fgets(str, sizeof str, stdin))
{
char *ptr;
num = strtol(str, &ptr, base);
*match = (*ptr == '\n'); // match is true if strtol stops scanning
// at the newline left by fgets
}
return (int)num;
}
...
bool match;
int num = to_number(oct, &match);
printf("%d %s an octal\n", num, match ? "is" : "is not");
编辑:
正如@klutt 在评论中指出的那样,由于 strtol
return 是一个 long
,理想情况下函数也应该 return long
以便避免转换,然后,如果你真的需要一个 int
,你可以转换函数的 return:
long to_number(int base, bool *match);
int num = (int)to_number(oct, &match);
我的代码做的是:
- 用户选择从十进制到八进制或八进制到十进制的转换。
- 用户输入一个数字
- 用户获取转换结果
现在我只想在从八进制转换为十进制时允许使用八进制数字,如果数字不是八进制,则给出错误消息。 如何实现?
#include <stdio.h>
#include <math.h>
int UmrechnungDezimalZuOktal(int dezimalzahl), UmrechnungOktalZuDezimal(int oktalzahl);
int main()
{
char auswahl;
int dezimalzahl, oktalzahl, nichtBeendet = 1, c;
while (nichtBeendet) {
printf("\n\n ################## AUSWAHL ##################\n"
" # #\n"
" # 1) Konvertierung Dezimal -> Oktal #\n"
" # 2) Konvertierung Oktal -> Dezimal #\n"
" # 3) Abbruch #\n"
" # #\n"
" ###############################################\n\n");
printf("Auswahl: ");
scanf("%c", &auswahl);
switch (auswahl) {
case '1': { /* Konvertierung Dezimal -> Oktal */
printf("Geben Sie eine positive, ganze Dezimalzahl ein: ");
scanf("%d", &dezimalzahl);
if (dezimalzahl >= 0)
{
printf("Die Dezimalzahl %d entspricht der Oktalzahl %d", dezimalzahl, UmrechnungDezimalZuOktal(dezimalzahl));
}
else
{
printf("Bitte nur positive Zahlen eingeben!");
}
break;
}
case '2': { /* Konvertierung Oktal-> Dezimal */
printf("Geben Sie eine positive, ganze Oktalzahl ein: ");
scanf("%d", &oktalzahl);
if (oktalzahl >= 0)
{
printf("Die Oktalzahl %d entspricht der Dezimalzahl %d", oktalzahl, UmrechnungOktalZuDezimal(oktalzahl));
}
else
{
printf("Bitte nur positive Zahlen eingeben!");
}
break;
}
case '3': { /* Abbruch */
nichtBeendet = 0;
break;
}
default: { /* Ungültige Eingabe*/
printf("Ungueltige Eingabe!");
break;
}
}
while ((c = getchar()) != '\n' && c != EOF) {};
}
}
int UmrechnungDezimalZuOktal(int dezimalzahl) /* Rechnung Dezimal -> Oktal */
{
int oktalzahl = 0, i = 1;
while (dezimalzahl != 0)
{
oktalzahl += (dezimalzahl % 8) * i;
dezimalzahl /= 8;
i *= 10;
}
return oktalzahl;
}
int UmrechnungOktalZuDezimal(int oktalzahl) /* Rechnung Oktal -> Dezimal*/
{
int dezimalzahl = 0, i = 0;
while (oktalzahl != 0)
{
dezimalzahl += (oktalzahl % 10) * pow(8, i);
++i;
oktalzahl /= 10;
}
i = 1;
return dezimalzahl;
}
我会用 fgets
和 strtol
:
scanf
和硬编码函数
enum {oct = 8, dec = 10, hex = 16};
int to_number(int base, bool *match)
{
char str[32];
long num = 0;
*match = false;
if (fgets(str, sizeof str, stdin))
{
char *ptr;
num = strtol(str, &ptr, base);
*match = (*ptr == '\n'); // match is true if strtol stops scanning
// at the newline left by fgets
}
return (int)num;
}
...
bool match;
int num = to_number(oct, &match);
printf("%d %s an octal\n", num, match ? "is" : "is not");
编辑:
正如@klutt 在评论中指出的那样,由于 strtol
return 是一个 long
,理想情况下函数也应该 return long
以便避免转换,然后,如果你真的需要一个 int
,你可以转换函数的 return:
long to_number(int base, bool *match);
int num = (int)to_number(oct, &match);