test - Beschränken Sie die Benutzereingabe auf eine 8-stellige Nummer




isdigit c 89 (4)

Es ist eine Weile her, seit ich mit der formatierten Eingabe in C getäuscht habe, aber scanf ("% 8d", & account_number);

Ich möchte einen Benutzer eine 8-stellige Kontonummer eingeben lassen. Der Code, den ich habe, scheint für alles zu funktionieren, außer du hast mehrere Buchstaben, zB: 'bbb' als Eingabe. Wenn dies geschieht, wird die while-Schleife dreimal ausgeführt, wobei printf angezeigt wird, aber keine weitere Eingabe angefordert wird.

Irgendeine Eingabe, wie man das repariert, oder eine bessere Art, es zu tun, ist willkommen!

Im Moment verwende ich:

#include <stdio.h>

int main()
{
int return_val = 0;
int account_number = 0;
int within_range = 0;

printf("Please enter your 8 digit account number:\n");
return_val = scanf("%d", &account_number);
getchar();
getchar();

if((account_number > 9999999) && (account_number < 99999999))
{
    within_range = 1;
}

while ((return_val != 1) || (within_range != 1))  
{
    printf("Invalid account number. Account number must be 8 digits.\n");
    printf("Please enter your 8 digit account number: \n");
    //scanf("%d", &clear);
    return_val = scanf("%d", &account_number);
    getchar();
    getchar();

    if((account_number > 9999999) && (account_number < 99999999))
    {
        within_range = 1;
    }
}

printf("Account #: %d", account_number);
}

Ich mag es wirklich nicht scanf() , fgets() , dann sscanf() .
Details unten.
2 Schlüsselzeilen:

if (fgets(buf, sizeof(buf), stdin) == NULL)
...
while (1 != sscanf(buf, " %8lu %c", &AccontNummner, &ch));

Lösung

#include <stdio.h>
#include <stdlib.h>
// Get 8 digit account number.  Returns -1 on I/O error or EOF
// Parsing error just tries again.
long Get8DigitAccountNumber(void) {
  const char *prompt = "Enter 8 digit account number: ";
  unsigned long AccontNummner;
  char ch;  // Extra text
  char buf[1024];
  do { // or while (1)
    ch = '\0';
    printf(prompt);
    fflush(stdout);  // Appears to be needed on some systems.
    prompt = "Error, try again: ";  // Used on re-try
    if (fgets(buf, sizeof(buf), stdin) == NULL) {
      return -1;  // handle I/O error
    }
  // If not _exactly_ one 1-8 digit field parsed, then try again.
  // Leading and trailing whitespaces are OK
  } while (1 != sscanf(buf, " %8lu %c", &AccontNummner, &ch));
  return (long) AccontNummner;
}

int main() {
  long AccontNummner;
  while ((AccontNummner = Get8DigitAccountNumber()) >= 0) {
    printf("# %lu\n", AccontNummner);
  }
  return 0;
}

Wenn Sie genau 8 Ziffern lesen möchten ...

  int n1 = 0;
  int n2 = 0;
  } while ((1 != sscanf(buf, " %n%8lu%n %c", &n1, &AccontNummner, &n2, &ch) || ((n2 - n1) != 8));

Akzeptierbares Format: [optionale Leerräume] [1-8 Ziffern] [optionale Leerräume] [nichts mehr]
sscanf() Format: " %8lu %c" .
Verwenden Sie %u anstelle von %d , um '-' nicht zuzulassen.
Erlauben Sie explizit optionale führende und nachfolgende Leerzeichen.
Das %c fängt alle nicht weißen Zeichen nach der achtstelligen Zahl ein.
sscanf() etwas über %c sscanf() wird mit sscanf() 2 zurückgegeben.


Wird es hilfreich sein, wenn Sie die Eingabe als Zeichenkette (mit fgets ) fgets und von dort mit sscanf ? Sie müssen sich keine Gedanken über die zusätzlichen getchar .

#include <stdio.h>

int get_acct_num()
{
    char line[80];
    int  acct_num;
    int return_val = 0;
    printf("Please enter your 8 digit account number:\n");
    fgets ( line, sizeof ( line ), stdin );
    return_val = sscanf(line, "%d", &acct_num);
    if ( return_val != 1 )
        return ( 0 );
    if ( ( acct_num < 10000000 ) || ( acct_num > 99999999 ) )
        return ( 0 );

    return ( acct_num );
}

int main()
{
    int account_number = 0;
    while ( ! ( account_number = get_acct_num() ) )
        printf("Invalid account number. Account number must be 8 digits.\n");


    printf("Account #: %d", account_number);
}

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main()
{
    int account_number = 0;
    int inval = 0;
    char acc_buf[256];
    printf("Please enter your 8 digit account number:\n");
    scanf("%s", acc_buf);
    if (strlen(acc_buf) == 8) {
        for (int i = 0; i < 8; i++)
            if (!isdigit(acc_buf[i])) {
                inval++;
                break;
            }
    } else inval++;
    if (!inval) {
        account_number = atoi(acc_buf);
        printf("Account #: %d\n", account_number);
    }
    return 0;
}




int