2016-04-11 10 views
5

Ich benutze eine Funktion, um durch Benutzer-ID, und PASWD und einige Fehlerprüfung zu analysieren. Die Funktion wird von meinem main() aufgerufen ... Allerdings werden nur die ersten 4 Zeichen meiner UserID und Pswd erfolgreich extrahiert. Ich bin neu in C-Programmierung und komme aus C# Ich bin mir nicht sicher, wo ich falsch liege. Das sollte ziemlich einfach sein, kann mir jemand in die richtige Richtung zeigen?C Programmierung Übergabe eines Char-Array in eine Funktion

static void func1(int argc, char *argv[], char *UserID[30], char *Psw[30]) 
{ 
    strncpy(UserID, argv[1], sizeof(UserID)); 
    strncpy(Psw, argv[2], sizeof(Psw)); 
} 

int main(int argc, char *argv[]) 
{ 
    char UserID[30];       
    char Psw[30]; 
    func1(argc, argv, UserID, Psw); 
} 

auch nur darauf hinweisen, wenn ich nicht die externe Funktion verwenden und den gesamten Code in meinem Haupt-func haben, dann funktioniert es.

EDIT: -

die Frage Figured aus: -

static void func1(int argc, char *argv[], char *UserID, char *Psw) 
{ 
    strncpy(UserID, argv[1], UserIDMaxSize); 
    strncpy(Psw, argv[2], PswMaxSize); 
} 

int main(int argc, char *argv[]) 
{ 
    char UserID[UserIDMaxSize + 1]; /* max val defined in a header file */       
    char Psw[PswMaxSize + 1]; /* max val defined in a header file */ 
    func1(argc, argv, UserID, Psw); 
} 

sizeof funktioniert nicht ganz, wie ich es erwartet .. es wurde die Größe meines Zeiger zu lesen, die immer 4 Zeichen standardmäßig.

+4

Hat der Compiler geben Sie alle Warnungen , was waren sie, und warum haben Sie sie ignoriert? –

+0

'Funktion': 'char *' unterscheidet sich in Ebenen der Indirektion von 'char **' – Philo

+0

'Strncpy': verschiedene Typen für formale und tatsächliche Parameter 1 – Philo

Antwort

1

Geben Sie die Array-Größe auf die Funktion

static void func1(int argc, char *argv[], char *UserID, size_t UserIDSize, 
    char *Psw, size_t PswSize) 
{ 
    if (argc> 1) strncpy(UserID, argv[1], UserIDSize); 
    if (argc> 2) strncpy(Psw, argv[2], PswSize); 
} 

int main(int argc, char *argv[]) 
{ 
    char UserID[30] = {0};  
    char Psw[30] = {0}; 
    func1(argc, argv, UserID, sizeof UserID, Psw, sizeof Psw); 
} 

das Ziel Arrays Null-Zeichen beendet sind, um zu gewährleisten, empfiehlt strncat() -> „ist ein abschließendes Nullzeichen immer angehängt das Ergebnis."strncpy() zu viele Probleme hat, es führt nicht immer in einem Array mit einem Null-Zeichen

static void func1(int argc, char *argv[], char *UserID, size_t UserIDSize, 
    char *Psw, size_t PswSize) { 
    UserId[0] = '\0'; 
    // if (argc> 1) strncat(UserID, argv[1], UserIDSize); 
    if (argc> 1) strncat(UserID, argv[1], UserIDSize - 1); 
    Psw[0] = '\0'; 
    // if (argc> 2) strncat(Psw, argv[2], PswSize); 
    if (argc> 2) strncat(Psw, argv[2], PswSize - 1); 
} 

[Bearbeiten]

Corrected Code -. Off von 1

1

TL; DR

Die sizeof ist nicht zu tun, was Sie erwarten. Verwenden Sie stattdessen strlen.


Sie sind nur 4 Zeichen, weil sizeof(char*[N]) für jede N kopiert bekommen wird nur die Größe eines Zeigers sein. Auf Ihrer Plattform muss ein Zeiger 4 Bytes (32 Bits) sein.

Ich denke, dass Sie tatsächlich die Basisadresse des Arrays in die Funktion übergeben möchten, aber in diesem Fall sind Ihre Typen nicht ganz richtig. Dein Compiler sollte dich davor warnen. Sie sollten die * von Ihrem letzten 2 Argumenttypen entfernen:

static void func1(int argc, char *argv[], char UserID[30], char Psw[30]) 

Das von der Warnung loswerden sollte, und es sollte eigentlich sizeof verhalten sich korrekt als auch (seit sizeof(char[30]) 30) machen. Allerdings ist es sehr einfach, Fehler mit sizeof zu machen, da das Verhalten mit einem char* und char[] anders sind ... Ich würde lieber strlen (oder strnlen, wenn Sie mögliche Pufferüberläufe vermeiden wollen) hier stattdessen, die Ihnen einfach sagen, wie viele Nicht-Null-Zeichen, die Sie haben.

Mit strnlen statt sizeof würde auch Ihnen helfen, weg zu kippen, dass Ihre Parametertypen falsch sind, da es wird sich beschweren, dass Sie eine char** an eine Funktion zu übergeben sind, der erwiesenermaßen ein char* erwartet.

+0

Wenn ich strlen so wie im Code verwende, dann bekomme ich nur die Zahlen in meiner Benutzer-ID und Pswd sind die restlichen Zeichen null-terminated .... Auch, nur um darauf hinzuweisen, wenn ich nicht die externe Funktion, und habe den gesamten Code in meiner Hauptfunktion, dann funktioniert es. – Philo

+0

Wie Scott Hunter in seinem Kommentar darauf hingewiesen hat, sollten Sie einige Compiler-Warnungen mit diesem Code erhalten, weil Sie einen Typenkonflikt haben ... Wenn Sie diese Warnungen beheben, würde es wahrscheinlich funktionieren. – DaoWen

2

Ich schätze, Ihr Zeiger hat eine Größe von 4 Byte. deshalb liest du nur 4 Zeichen.

+0

Ihr Punkt gab mir den Hinweis. Vielen Dank. – Philo

-1

Lösung

#include <stdio.h> 
#include <string.h> 
void func1(int argc, char *argv[], char *UserID, char *Psw) 
{ 
    strncpy(UserID, argv[1], strlen(argv[1])); 
    strncpy(Psw, argv[2], strlen(argv[2])); 
printf("DATA: %s \n",UserID); 
printf("DATA1: %s \n",Psw); 
} 

int main(int argc, char *argv[]) 
{ 
    char UserID[30]; 
    char Psw[30]; 
     printf("argv1 %ld \n",strlen(argv[1])); 
     printf("argv2 %ld \n",strlen(argv[2])); 
    func1(argc, argv, UserID, Psw); 
} 
+0

immer noch das gleiche Problem, nur die ersten 4 Zeichen – Philo

+1

konsistente Einrückung würde diesen Code viel lesbarer von uns Menschen machen. – user3629249

Verwandte Themen