2016-04-12 4 views
1

wiederholen Ich arbeite an einem Projekt für eine Programmiersprache "C". Ich habe ein Problem, für das ich keine Abhilfe finden konnte. Das Problem liegt in meiner Struktur, die ich verwende. Er nimmt alle Daten, die ich eingibt, und wiederholt sie 6 Mal. Mein Code istStrukturen, die eingegebene Daten in C

Für die Struktur:

struct authstruct 
    { 
     char userName[MAXCHAR]; 
     char userPin[MAXCHAR]; 
    }; 

Linie, den Eingang

struct authstruct usr; 
    printf("Please enter your username\n"); 
    scanf("%s",usr.userName); 
    while (fscanf(fident, "%s%s", auth.userName, auth.userPin) != EOF) 
    { 
     printf("%s", usr.userName); 
    }; 

Hinweis empfängt, ich habe es Satz, den Code zu drucken, das es zu Testzwecken ist recieveing. Wenn Sie zum Beispiel eingegeben

test 

wäre es

testtesttesttesttesttest 

Der gesamte Code kick out (ohne Berücksichtigung von nicht-verwandten Funktionen und ohne die oben edit) ist:

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

/* Defining of constants */ 
#define MAXCHAR 10 
#define MAXATTEMPTS 3 
#define SIZE 10 

/* Prototypes */ 
int AuthFunc(void); 

/* Prototype of structure for Authentication Function */ 
struct authstruct 
{  
    char userName[MAXCHAR]; 
    char userPin[MAXCHAR]; 
}; 

int main(VOID) 
{ 
    int login; 
    login = AuthFunc(); 
    if (login == -1) 
    { 
     printf("namepass.txt could not be found\nPlease check for file and try again\n"); 
    } 
    else if (login == 1) 
    { 
     printf("You have tried too many times to login\nPlease restart and try again\n"); 
    } 
    else if (login == 0) 
    { 
     printf("Success!"); 
    } 
    return 0; 
} 

/* This function authenticates the user */ 
int AuthFunc(void) 
{ 
    int i = 0; 
    FILE *fident; 
    fident=fopen("namepass.txt", "r"); 
    if (fident==NULL) 
    { 
     return -2; 
    } 

    printf("Hello! Please follow my instructions\n"); 
    struct authstruct auth; 
    for (i=0; i < MAXATTEMPTS; i++) 
    { 
     struct authstruct usr; 
     printf("Please enter your username\n"); 
     scanf("%s",usr.userName); 
     while (fscanf(fident, "%s%s", auth.userName, auth.userPin) != EOF) 
     { 
      if ((strcmp(usr.userName, auth.userPin)) == 0) 
      { 
       printf ("Please enter your password.\n"); 
       scanf ("%s",usr.userPin); 
       if ((strcmp(usr.userPin, auth.userPin)) == 0) 
       { 
        fclose(fident); 
        return 0; 
       } 
      } 
     } 
     printf("Incorrect username/password.\n"); 
    }  
    fclose(fident); 
    return 1; 
} 

So führen diese Sie müssen eine neue TXT-Datei namens namepass.txt mit dem ausgewählten Benutzernamen/Passwort erstellen, die in einer Zeile wie im folgenden Beispiel

angeordnet ist
test 12345 
test2 23456 

Ich entschuldige mich für die lange Post, versuchte nur so beschreibend wie möglich zu sein. Dies wurde eingehalten und in Xcode 7.3 auf einem Mac mit OSX 10.11.4 ausgeführt. Wenn dieses Problem nicht auf Ihrem Computer auftritt, lassen Sie es mich wissen und ich fange an, meine Compiler-Einstellungen zu untersuchen. Danke

+1

Zumindest Sie vergleichen Benutzername zum ersten Mal in der Schleife ... –

+1

... und Sie nie Ihre Datei zwischen Versuchen zurückspulen. – WhozCraig

+0

'if ((strcmp (usr.userName, auth.userPin)) == 0)' -> 'if ((strcmp (usr.userName, auth.userName)) == 0)' – BLUEPIXY

Antwort

0

while (fscanf(fident, "%s%s", auth.userName, auth.userPin) != EOF) sieht falsch aus. fscanf gibt eine int zurück, die 2 sein wird, wenn beide Messwerte bestehen.

ändern Sie sich an:

while (fscanf(fident, "%s%s", auth.userName, auth.userPin) == 2) 

auch, wie durch WhozCraig in comment erwähnt, sollten Sie entweder die Dateien zu Anfang zurückspulen oder das Öffnen und Schließen der Datei in AuthFunc innerhalb for Schleife begrenzen.

von man fscanf:

Diese Funktionen geben die Anzahl der Eingabeelemente erfolgreich abgestimmt und zugeordnet, die als vorgesehen weniger sein kann, oder sogar Null im Falle eines frühen Anpassungsfehler.

Der Wert EOF wird zurückgegeben, wenn das Ende der Eingabe vor der ersten erfolgreichen Konvertierung oder einem Übereinstimmungsfehler erreicht wird. EOF wird auch zurückgegeben, wenn ein Lesefehler auftritt. In diesem Fall wird der Fehlerindikator für den Datenstrom (siehe ferror (3)) gesetzt und errno wird gesetzt, um den Fehler anzuzeigen.

+0

Außerdem: 1) Wie soll 'fscanf()' wissen, wenn eine Zeichenfolge endet und eine andere beginnt? 2) "Finden" wurde nicht initialisiert. – trojanfoe

+1

1) Das! = EOF war für das ich dachte 2) Ich habe die Initialisierung von fident zu dem kurzen Code, den ich am Anfang eingefügt habe, nicht hinzugefügt, aber wenn Sie den großen Block gründlich durchsehen, ist es da. –

+0

Vielen Dank, das behebt mein Problem und fügt die Zeile 'rewind (fident);' direkt nach der Zeile 'scanf ("% s ", usr.userName) hinzu;' fügt das erforderliche Zurückspulen der Datei hinzu, wenn gepaart Die Fixes, die du und @SamiKuhmonen mir gegeben hast, erlaubten diesen Code perfekt zu laufen. –