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.
Der "%s"
-Formatbezeichner für printf
immer 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:
(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.
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.
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);
Nach meiner Erfahrung sollten Sie Segmentierungsfehler erhalten, wenn Sie versuchen, die% s-Direktive mit * p zu verwenden.