2017-02-25 4 views
0

Ich habe eine Funktion erstellt, die einen char-Zeiger aufnimmt. Ich bekomme zuerst den String-Wert von fgets, die Eingabe, die ich eingib, ist "rwx". Wenn ich diesen Wert eingabe, sagt strlen, dass es Länge 2 ist und wenn ich auf den ersten Index des Char-Arrays schaue, gibt es rw statt r zurück. Darf ich fragen, wo ich falsch liege, wenn ich durch die Saite gehe?fgets() liest weniger Zeichen als erwartet

Was ich versucht habe:

int main() 
{ 
    char access[3]; 

    while (ValidateAccess(access)) 
    { 
     printf("Please enter your access\n"); 
     fgets (access, 3, stdin); 
    } 
    return 0; 
} 

int ValidateAccess(char * access) 
{ 
    int length = strlen(access); 
    int r = 0,w = 0,x = 0,i; 

    printf("this is the length %d\n", length); 

    if (length == 0) 
     return 1; 

    for(i = 0; i < length; i++) 
    { 
     printf("this is the character: %s", &access[i]); 

     if (strcmp(&access[i], "r") == 0) 
      r++; 
     else if (strcmp(&access[i], "w") == 0) 
      w++; 
     else if (strcmp(&access[i], "x") == 0) 
      x++; 
    } 

    if (r <=1 && w <= 1 && x <= 1) 
     return 0; 
    else 
     return 1; 
} 

, wenn das Programm läuft ist dies ist der Ausgang

"this is the length 0" 
Please enter your access 
rwx 
this is the length 2 
this is the character: rw 
+0

letzte Zeichen ist '\ 0'. – Shravan40

Antwort

2

man fgets ist eine sehr nützliche Lektüre. Lassen Sie mich anführen: "fgets() liest maximal einen Zeichen weniger als Größe aus dem Stream ein ..."

Die Zeichenfolgen in C werden voraussichtlich mit \0 (Nullbyte) beendet. Wenn Sie access als ein Array von 3 Elementen definieren, verfügt es über einen Raum für eine Zeichenfolge der Länge 2 - zwei Zeichen plus , die das Nullbyte beendet. Wenn Sie fgets aufrufen, die besagt, dass Sie über den Speicherplatz für 3 Byte verfügen, liest es zwei Zeichen, legt sie in den ersten zwei Byte ab und setzt End-null in dem dritten Byte.

Definieren Sie access a mit 4 Bytes und übergeben Sie 4 an fgets.

Zusätzlich Sie drucken Zeichenfolge kein char, so druckt es alles rund um den abschließenden Null-Byte (das ist, wo rw Sie kommt aus sehen). Wenn Sie ein einzelnes Zeichen drucken möchten, verwenden Sie %c in Formatzeichenfolge, nicht %s (und Sie sollten ein Zeichen übergeben, kein Zeiger dann).

Probieren Sie das folgende Programm und stellen Sie sicher, dass Sie die Ausgabe verstehen.

#include <stdio.h> 

int main() { 
     char *foo = "barbaz"; 

     printf("%c\n", foo[2]); 
     printf("%s\n", foo + 2); 
} 
+0

Hallo @avysk Ich habe es gerade versucht, die Länge ist jetzt bis zu drei, wenn ich den Zugriff auf Länge 4 ändern und Fgets zu 4. Aber jetzt für Index 0 die Ausgabe, die ich bekomme, ist rwx, Index 1 ich bekomme wx, index 2 Ich bekomme x. Es sollte r dann w dann x sein. – Master

+0

@Master Weil Sie ** string ** drucken ** kein Zeichen ('% s' bedeutet String) - und es druckt alles von einem gegebenen Zeichen bis zum abschließenden Nullbyte. Sie müssen '% c' nicht'% s' verwenden, wenn Sie ein einzelnes Zeichen drucken möchten. – avysk

+0

@Master Ich habe durch die Antwort einschließlich Informationen über das Drucken aktualisiert. – avysk

Verwandte Themen