2017-01-28 1 views
2

Ich habe folgende C-Anwendung geschrieben:Warum String wird immer auf mit „+“ opeartor in printf getrimmt

#include <stdio.h> 

struct Book { 
    int a; 
    int b; 
}; 

int main() { 

    struct Book book; 
    book.a = 10; 
    book.b = 20; 

    printf("The value set for struct a " + book.a); 

    return 0; 
} 

I + innen printf verwendet haben erwartet, dass es die Zeichenfolge verketten, sondern wird zunächst 10 Charakter Trimmen und geben die Ausgabe wie folgt, ich weiß, ich sollte %d verwenden und book.a als zweites Argument, übergeben, aber warum printf trimmt meine Zeichenfolge?

set for struct a 
+3

Der '+' Operator verketten Zeichenfolge nicht mit ganzen Zahlen. –

+3

Sie machen Zeiger-Arithmetik, nicht Verkettung. – tkausl

+2

Ein String-Literal zerfällt in einen Zeiger auf sein erstes Element. Die Verwendung von Operator + auf einem Zeiger erhöht den Zeiger vorwärts. Sie können den Rest herausfinden. – DeiDei

Antwort

2

Eine String-Konstante in manchen Kontexten zerfällt in einen Zeiger auf das erste Element, das ist das, was hier geschieht. Wenn Sie dann einem Zeiger einen Ganzzahlwert hinzufügen, inkrementiert er den Zeiger um so viele (im Fall von char *) Bytes.

Da book.a 10 ist, fügen Sie dem Wert des Zeigers 10 hinzu. Sie haben jetzt einen Zeiger auf das 10. Element in der Zeichenfolge. Das empfängt printf, und von wo aus beginnt es zu drucken.

"The value set for struct a" 
      ^--- 10th character 
1

Es gibt kein eingebautes in Strings in C, allein String-Operatoren lassen. Null-terminierte String-Literale ist, wo String-Unterstützung auf der Sprachebene endet; alles andere wird in der Standardbibliothek erledigt.

Der Operator + fügt Nummer 10 zum Wert Zeiger hinzu, in den das Zeichenfolgenliteral konvertiert wird. Dies erzeugt einen Zeiger auf die Mitte der Zeichenkette, der gedruckt wird, sobald der Formatbezeichner %s angewendet wird.

Im Wesentlichen dieser Ausdruck

"The value set for struct a " + book.a 

tut das Gleiche wie diesem Code:

char prtStr[] = "The value set for struct a "; 
char *ptrMid = &ptrStr[book.a]; 
printf("%s", ptrMid); 

Wenn Sie 10 nach der Zeichenfolge drucken möchten, verwenden Sie %d, wie folgt aus:

printf("The value set for struct a %d", book.a); 
+0

Der dem Zeiger hinzugefügte Wert ist kein Zeichencode, sondern nur eine ganze Zahl. –

+0

@KeithThompson Ah, du hast absolut recht, danke! – dasblinkenlight

1

Die Zeichenfolge "The value set for struct a " wird als Punkt dargestellt in den Speicher, der ein Null-terminiertes Array von Zeichen enthält. Indem Sie book.a (10) hinzufügen, haben Sie auf das zehnte Element des Puffers verwiesen, das "s" ist. Was Sie brauchen, ist:

printf("The value set for struct a %d", book.a); 
Verwandte Themen