2016-07-10 9 views
0

Ich versuche, einen Code zu schreiben, der eine gegebene Zeichenfolge mit einem Zeiger durchläuft, um es zu analysieren.Wie bekomme ich einen Zeiger zurück von einer Void-Funktion, nachdem es durch einen String-Zeiger iteriert

Der ursprüngliche Code, den ich schrieb, funktionierte gut, aber es war ... redundant, also versuchte ich, es in einen Funktionsanruf zu machen, um es prägnanter zu machen. Hier ist, was ich habe:

char inputArray[300]; 
char buffer[300]; 
char username[100]; 
char password[100]; 
char name[100]; 
int i=0; 

void repeat(char *to) 
{ 
    while(*to!='=') 
    { 
    to++; 
    } 
} 

void array(char *mm,char *tt) 
{ 
    i=0; 
    while(*tt!='+') 
    { 
    mm[i]=*tt; 
    tt++; 
    i++; 
    } 
} 

int main() 
{ 
printf("give me the shit in this fashion: username=?+password=?+real=?\n"); 
scanf("%s",inputArray); 
strcpy(buffer,inputArray); 
char *tok=buffer; 

repeat(tok); 
tok++; 

array(username,tok); 
repeat(tok); 

tok++; 

array(password,tok); 

tok++; 

repeat(tok); 
tok++; 

array(name,tok); 
} 

Aus irgendeinem Grund wird es mir nicht um den Zeiger Array zurückgeben tok, wo es von der vorherigen Funktionsaufruf aufhörte. Warum das? es verhält sich so, als würde der Zeiger nach dem Aufruf von vorne beginnen.

Antwort

0

ändern Sie einfach Ihre repeat dazu:

void repeat(char **to) { 
    while (**to != '=') { 
     (*to)++; 
    } 
} 

und es so nennen:

repeat(&tok); 

und prüfen Sie immer auf Fehler:

if (scanf("%299s", inputArray) != 1){ 
    printf("incorrect input\n"); 
    return 1; 
} 

und Ihre Beispielcode (und fügen Sie die Überprüfung auf Fehler in array und repeat t hinzu o nicht außerhalb der Grenzen gehen):

#include <inttypes.h> 
#include <stdio.h> 
#include <stdint.h> 

char inputArray[300]; 
char buffer[300]; 
char username[300]; 
char password[300]; 
char name[300]; 
int i = 0; 

void repeat(char **to) { 
    while (**to != '=') { 
     (*to)++; 
    } 
} 
void array(char *mm, char *tt){ 
    i = 0; 
    while (*tt != '+') { 
     mm[i] = *tt; 
     tt++; 
     i++; 
    } 
} 
int main() { 
    printf("give me the shit in this fashion: username=?+password=?+real=?\n"); 
    if (scanf("%299s", inputArray) != 1){ 
     printf("incorrect input\n"); 
     return 1; 
    } 
    inputArray[299] = 0; 
    strcpy(buffer, inputArray); 
    char *tok = buffer; 

    repeat(&tok); 
    tok++; 

    array(username, tok); 
    repeat(&tok); 

    tok++; 

    array(password, tok); 

    tok++; 

    repeat(&tok); 
    tok++; 

    array(name, tok); 
} 

und Sie können diese nicht außerhalb der Grenzen nutzen zu gehen:

#include <inttypes.h> 
#include <stdio.h> 
#include <stdint.h> 


char* read_str(char *src, char *dst){ 
    char *p, *q; 
    p = src; 
    while (*p != 0 && *p != '=') p++; 
    if (*p == 0) { 
     *dst = 0; 
     return NULL; // '=' not found 
    } 
    p++; 

    q = p; 
    while (*q != 0 && *q != '+') q++; 
    //if (*q == 0) return NULL;// '+' not found 

    while (p <= q) *dst++ = *p++; 
    dst--; 
    *dst = 0; 
    q++; 
    return q; 
} 
#define MAX_LEN 100 
int main() { 
    char username[MAX_LEN]; 
    char password[MAX_LEN]; 
    char name[MAX_LEN]; 
    char inputArray[MAX_LEN] = "username=Alex+password=123+real=Alex"; 
    char *p = inputArray; 

    p = read_str(p, username); 
    if (p == NULL)return 1; // error 
    p = read_str(p, password); 
    if (p == NULL)return 1; // error 
    read_str(p, name); 

    printf("username: %s \n", username); 
    printf("password: %s \n", password); 
    printf(" name: %s \n", name); 
} 
+0

ist es normal, dass ich einen Segmentierungsfehler bekomme, nachdem es das erste Zeichen durchlaufen hat? – harekuin

+0

@harekuin: Nein, probieren Sie Beispielcode. und geben Sie die richtige Zeichenfolge ein und fügen Sie die Überprüfung auf Fehler im Array hinzu und wiederholen Sie, um nicht außerhalb der Grenzen zu gehen. –

+0

Vielen Dank für den wirklich beschreibenden Code! : D – harekuin

1

Funktionen erhalten Kopien ihrer Argumente. Originalargumente bleiben davon unberührt.

Etwas zurückgeben hat eine spezielle Syntax in C: die return Anweisung. So

char* repeat (char *to) // <- this function gives back a char* 
{ 
    while (*to != '=') 
    { 
    to++; 
    } 
    return to; // <- giving something back 
} 

Nennen Sie es wie folgt aus:

tok = repeat(tok); 

Treat array in der gleichen Art und Weise.

Hinweis 1, diese Funktion führt zu * undefiniertem Verhalten, wenn die Zeichenfolge '=' nicht enthält.

Anmerkung 2, es ist auch möglich, einen Zeiger an tok zu übergeben, wie die andere Antwort vorschlägt, aber aus Gründen der Klarheit wird nur empfohlen, diesen Stil zu verwenden, wenn Sie mehr als eine Sache aus einer Funktion zurückgeben müssen.