2016-05-30 16 views
2

Ich versuche, 2 weitere Zeichen nach dem Finden der ersten Vorkommen mit strchr über einen Char-Zeiger zu bekommen. Die Zeichenfolge kann wie folgt aussehen:Advance Zeiger und bekomme 2 weitere Zeichen nach strchr in C

foo;bar;2012 -> should output foo;b 
foo;caz;  -> should output foo;c 
foo;   -> should output foo (there are no +2 chars) 
foo   -> null 

Für den ersten Fall, Ich denke, ich kann wie,

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

int main() 
{ 
    char str[] = "foo;bar;2012"; 
    char *pch = NULL; 

    if ((pch=strchr(str,';')) != NULL) { 
    *pch++; 
    *pch++; 
    *pch = '\0'; 
    } 
    puts(str); 
    return 0; 
} 

etwas tun, aber was ist der richtige Weg, zu überprüfen, ob ich den Zeiger innerhalb der Zeichenfolge voranbringen kann, ohne gehen über?

+1

Wenn Sie mehr als 2 Zeichen handhaben müssen, oder eine beliebige Anzahl von ihnen, dann strlen (str) verwenden, um die Länge zu bekommen . Danach können Sie einen Endzeiger mit str + len erstellen, um ihn mit pch zu vergleichen, oder Sie können Ihren Index mit pch - str finden, um ihn mit len ​​zu vergleichen. Dann subtrahieren Sie, um zu ermitteln, wie viele Zeichen am Ende der Zeichenfolge stehen. –

+0

@ZanLynx Danke, großartig darüber zu wissen. –

+0

Versuchen Sie, jedes '* pch ++;' zu 'if (* pch) pch ++;' – Dmitri

Antwort

3

Die Zeilen *pch++ sollten eine Compilerwarnung generieren (wenn dies nicht der Fall ist, werden nicht genügend Warnungen generiert). Ich kompilieren mit als Fehler behandelt Warnungen so erhalte ich:

xw31.c:10:5: error: value computed is not used [-Werror=unused-value] 
    *pch++; 

Sie pch++; verwenden sollte -, die nicht lesen, aber den Wert ignorieren.

Sie sollten überprüfen, dass Sie Ende der Zeichenfolge nicht erreicht haben, während darüber hinaus, wo strstr() Punkte, die Sie zugreifen, so verwenden:

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

int main(void) 
{ 
    char str[] = "foo;bar;2012"; 
    char *pch; 

    if ((pch = strchr(str, ';')) != NULL) 
    { 
     if (pch[1] != '\0' && pch[2] != '\0') 
      pch[3] = '\0'; 
     puts(str); 
    } 
    return 0; 
} 

Wenn der innere Test fehlschlägt, ist der String kurz genug bereits. pch[0] ist natürlich das Semikolon. Dies erzeugt foo;ba als den Ausgang. Wenn Sie nur foo;b wollen, dann brauchen Sie nur ein Zeichen zu testen weniger voraus:

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

int main(void) 
{ 
    char str[] = "foo;bar;2012"; 
    char *pch; 

    if ((pch = strchr(str, ';')) != NULL) 
    { 
     if (pch[1] != '\0') 
      pch[2] = '\0'; 
     puts(str); 
    } 
    return 0; 
} 
+0

Danke, verstehe ich jetzt. Ich war mir nicht sicher, ob es sicher war, das nächste Char 'pch [1] zu überprüfen. –

+0

Vorausgesetzt, dass Sie mit einer (null terminierten) Zeichenfolge beginnen, wissen Sie, dass nach dem Semikolon mindestens ein Byte vorhanden sein muss, damit es sicher gelesen werden kann. Der angezeigte Code prüft, ob es sicher ist, weiter zu gehen. Es könnte manchmal ein Null-Byte mit einem anderen überschreiben. –