it-swarm.com.de

Kann ein Zeiger auf einen String werden?

Ich denke an etwas wie:

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

int main(void) {
    //test pointer to string
    char s[50];
    char *ptr=s;
    printf("\nEnter string (s): ");
    fgets(s, 50, stdin);
    printf("S: %s\nPTR: %s\n", s, *ptr);

    system("PAUSE");
    return 0;
}

Oder sollte ich eine for-Schleife mit * (s + i) und dem Formatbezeichner% c? .__ verwenden. Ist dies die einzige Möglichkeit, einen String durch einen Zeiger und eine einfache printf zu drucken?

Update: Die printf arbeitet mit der Adresse des ersten Elements des Arrays. Wenn ich also * ptr verwende, arbeite ich eigentlich mit dem ersten Element und nicht mit seiner Adresse. Vielen Dank.

18
andreihondrari

Der "%s"-Formatbezeichner für printfimmer erwartet ein char*-Argument.

Gegeben:

char s[] = "hello";
char *p = "world";
printf("%s, %s\n", s, p);

it sieht aus, als würden Sie ein Array für den ersten %s und einen Zeiger für den zweiten übergeben, aber tatsächlich übergeben Sie (richtig) Zeiger für beide.

In C wird jeder Ausdruck des Array-Typs implizit in einen Zeiger auf das erste Element des Arrays sofern nichtkonvertiert, _ es befindet sich in einem der folgenden drei Kontexte:

  • Dies ist ein Argument für den unären Operator "&" (Adresse von)
  • Dies ist ein Argument für den unären Operator "sizeof"
  • Es ist ein Zeichenfolgenliteral in einem Initialisierungsprogramm, das zum Initialisieren eines Array-Objekts verwendet wird.

(Ich denke, C++ hat eine oder zwei andere Ausnahmen.)

Die Implementierung von printf() sieht den "%s", nimmt an, dass das entsprechende Argument ein Zeiger auf char ist, und verwendet diesen Zeiger, um die Zeichenfolge zu durchlaufen und zu drucken.

Abschnitt 6 des comp.lang.c FAQ hat eine ausgezeichnete Diskussion darüber.

33
Keith Thompson
printf("%s\n", ptr);

Ist das was du willst?

Übrigens, aus printf(3) , hier ist die Dokumentation für den s-Konvertierungsspezifizierer (d. H. %s):

Wenn kein l-Modifikator vorhanden ist: Das const char * -Argument wird mit .__ erwartet. ein Zeiger auf ein Array des Zeichentyps sein (Zeiger auf einen String) . Zeichen aus dem Array werden bis zu einer .__ geschrieben (aber nicht eingeschlossen). Beenden des Nullbytes ('\ 0'); Wenn eine Genauigkeit angegeben wird, nicht mehr als die angegebene Zahl wird geschrieben. Wenn eine Genauigkeit angegeben ist, nein null Byte muss vorhanden sein; wenn die Genauigkeit nicht angegeben ist oder .__ ist. größer als die Größe des Arrays, muss das Array eine .__ enthalten. null Byte zu beenden.

7
Bertrand Marron

sie sollten "printf (" S:% s\nPTR:% s\n ", s, ptr); " anstelle von printf ("S:% s\nPTR:% s\n", s, * ptr);

unterschied zwischen ptr und * ptr ist: ptr gibt die Adresse im Speicher der Variablen an, auf die Sie zeigen, und * ptr gibt eher den Wert der angezeigten Variablen an * ptr = ptr [0]

dieser Code zeigt, was ich meine:

printf("\tS: %s\n\tPTR: %s\n\tAddress of the pointed Value: %x\n\tValue of the whole String: %s\n\tValue of the first character of the String: %c\n", s, ptr,ptr,ptr,*ptr);
1
arthur

Nach meiner Erfahrung sollten Sie Segmentierungsfehler erhalten, wenn Sie versuchen, die% s-Direktive mit * p zu verwenden.

0
MAIGA