2017-01-06 1 views
0

Ok, also habe ich Bucky Roberts Tutorials über C-Programmierung geschaut und die erste Aufgabe, die er den Zuschauern gibt Machen Sie ein Programm, das prüft, ob ein Passwort mindestens ein Großbuchstabe, eine Ziffer und ein Dollarzeichen hat.

Dies ist mein Code:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 

int main() 
{ 
    int upper = 0; 
    int digit = 0; 
    int dollar = 0; 

    char password[16]; 

    int loop = 1; 

    while(loop == 1){ 

     printf("Enter your password: "); 
     scanf(" %s", password); 

     int i; 
     for(i = 0; i <= 16; i++){ 
      printf(" %c", password[i]); 

      if(isupper(password[i])){ 
       upper = 1; 
       printf("\t is upper"); 
      } 

      if(isdigit(password[i])){ 
       digit = 1; 
       printf("\t is digit"); 
      } 

      if(password[i] == '$'){ 
       dollar = 1; 
       printf("\t is dollar"); 
      } 
      printf("\n"); 
     } 

     if((upper == 1) && (digit == 1) && (dollar == 1)){ 
      printf("Your password is valid\n"); 
      loop = 0; 
     } else { 
      printf("Your password is invalid\n"); 
     } 
    } 

    return 0; 
} 

Das Programm druckt diese in der Konsole nach einer Eingabe von 'P4sswoRd':

Enter your password: P4sswoRd 
P  is upper 
4  is digit 
s 
s 
w 
o 
R  is upper 
d 

╨ 

@ 

ö 
  
` 
$  is dollar 
Your password is valid 

Keiner der Passwörter i enthalten eingegeben das Zeichen '$' Dennoch findet das Programm immer noch einen Weg, es zu erkennen. Der Grund dafür ist, dass er "is digit" oder "is dollar" druckt, nachdem der Charakter überprüft hat, was im Code falsch gelaufen ist und warum die Passwörter gültig sind. Ich habe keine Ahnung, warum all diese zufälligen Charaktere gedruckt werden, und ich würde eher wissen, was mit meinem Programm falsch läuft, anstatt eine neue Herangehensweise an die Aufgabe zu machen.

+0

Ok, so fixierte i, dass ein Teil des Codes (danke durch die Art und Weise), aber das nur zum Teil darauf fixiert. Es wird nicht immer gültig gedruckt, solange ein Großbuchstabe und eine Ziffer vorhanden sind. Wenn das Passwort 1A ist, ist es gültig, 1a ist ungültig. Die zufällige Liste von seltsamen Zeichen ist immer noch vorhanden, vielleicht hat es etwas mit der Variable i und ihrer Verwendung beim Erkennen des '$' - Zeichens in der for-Schleife zu tun. –

+0

Schauen Sie sich die [this] (https://www.tutorialspoint.com/c_standard_library/c_function_scanf.htm) Seite an: Sie sollten den Rückgabewert von scanf verwenden. –

Antwort

3

Diese Schleife ist falsch:

for(i = 0; i <= 16; i++){ 

Wenn Sie nur 4 Zeichen eingeben, sollten Sie nur die ersten 4 Zeichen des Strings überprüft werden. Das ist der Grund, warum Sie viele zufällige Zeichen sehen - das ist der Müll, der in den restlichen Elementen von password ist. Es sollte sein:

size_t pw_len = strlen(password); 
for (i = 0; i < pw_len; i++) { 

Beachten Sie auch, dass, da Arrays Null-basiert sind, das letzte Element der Anordnung der Indexlänge-1 hat. Wenn Sie also alle Elemente eines Arrays, das als password[16] deklariert ist, verarbeiten möchten, sollte das Schleifenkriterium i < 16 sein, nicht i <= 16 - das wird versuchen, auf das Array außerhalb der letzten Iteration zuzugreifen.

Sie müssen auch die upper, digit und dollar Variablen am Anfang der while Schleife initialisieren. Ansonsten, wenn Sie ein Passwort mit Zahlen und $ eingeben, dann ein neues Passwort mit Obermaterial, das zweite Passwort wird als gültig bezeichnet, da es immer noch die digit und dollar Einstellungen vom vorherigen Passwort hat.

So soll es sein:

while(loop == 1){ 
    upper = digit = dollar = 0; 
+0

Danke, das hat geholfen, die zufälligen Zeichen werden nicht mehr angezeigt. Das Problem besteht jetzt darin, dass es im Fall mit einem '$' Zeichen und nur einer Zahl anstelle eines '$' Zeichens, einer Zahl und eines Großbuchstabens gültig ist. –

+0

Sie müssen die Variablen 'upper',' digit' und 'dollar' jedes Mal durch die 'while'-Schleife zurücksetzen. – Barmar

+0

Vielen Dank! Das Programm ist jetzt behoben, ich schätze die Hilfe, Barmar. –

Verwandte Themen