2017-07-27 1 views
2

Ich habe ein Array:Wie werden nur einige Zeichen in C gedruckt?

char arr[]="This is the string"; 

Zum Beispiel, wenn ich nur die ersten 5 Zeichen dieser Zeichenkette ausdrucken möchten, habe ich versucht, die folgenden:

printf("%-5s",arr); 

Aber es ganze Reihe gedruckt wird. Warum?

+1

'"% -5s "' ist nur ein String-Formatierer. Die Zeichenfolge wird nicht abgeschnitten. –

+1

verwenden Präzision. Google-Genauigkeit für printf. –

+1

@xing sind Sie sicher über '.-' Syntax? AFAIR, '-' ist eine Flagge ... also ... –

Antwort

3

- ist ein printf formater für Rechtfertigung, nicht Präzision.

Was Sie wollen, ist die . formater, die für Präzision verwendet wird:

printf("%.5s", arr); 

Dadurch werden die ersten 5 Elemente von arr drucken.

Wenn Sie mehr über printf formaters erfahren möchten, werfen Sie einen Blick auf this link.

4

Sie können %.*s verwenden, es dauert Größe der beabsichtigten zu druckenden Bytes und Zeiger auf char als Argumente bei Verwendung mit printf. Zum Beispiel

// It prints This 
printf("%.*s", 4, arr); 

Aber es druckt ganze Reihe. Warum?

Sie verwenden %-5s Bedeutung der - linksrechtfertigt Ihren Text in das Feld.


En passant, kann die Ausgabe nicht unter Verwendung der akzeptierte Antwort so einfach wie die Code-Schnipsel erreicht werden, auch wenn es spöttisch schien sein.

int i; 
char arr[]="This is the string"; 

for (i = 1; i < sizeof(arr); ++i) { 
    printf("%.*s\n", i, arr); 
} 

Ausgang:

T 
Th 
Thi 
This 
This 
This i 
This is 
This is 
This is t 
This is th 
This is the 
This is the 
This is the s 
This is the st 
This is the str 
This is the stri 
This is the strin 
This is the string 
+0

Wirklich schön zu verwenden von '*' zu erlauben dynamische Auswahl der Anzahl der Zeichen zur Anzeige – Garf365

+0

Ja, die Genauigkeit zwischen den Zitaten ist manchmal nicht gut, denn was, wenn ich seinen Wert konsistent in einer 'For-Schleife 'oder mit ändern möchte Makrodefinition '# define ....' wie das @ Garf365 – snr

0

zum Beispiel Teilzeichenextraktionsfunktion (extrahiert String zum Buff)

char *strpart(char *str, char *buff, int start, int end) 
{ 
    int len = str != NULL ? strlen(str) : -1 ; 
    char *ptr = buff; 

    if (start > end || end > len - 1 || len == -1 || buff == NULL) return NULL; 

    for (int index = start; index <= end; index++) 
    { 
     *ptr++ = *(str + index); 
    } 
    *ptr = '\0'; 
    return buff; 
} 
+1

Ich denke, diese Lösung ist in diesem Fall nicht die gewünschte – horro

+0

@horro warum? er möchte ** einen ** Teil der Zeichenkette drucken, wie der Titel sagt. –

+1

Ingenieur, der mit minimalem Lagerbestand die besten Sachen macht. – snr

0

Sie es in einer Reihe von Möglichkeiten ganz einfach tun können. Mit einer Schleife, Schleifen die gewünschte Anzahl, Abholung Zeichen jedes Mal, können Sie einen Zeiger auf die Zeichenfolge ein temporäres Null-Ende nach dem 5. Zeichen gehen, oder Sie können einfach strncpy verwenden, um 5 Zeichen in einen Puffer zu kopieren und zu drucken Das. (das ist wahrscheinlich das einfachste), z.B.

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

int main (void) 
{ 
    char arr[]="This is the string", 
     buf[sizeof arr] = "";  /* note: nul-termination via initialization */ 

    strncpy (buf, arr, 5); 

    printf ("'%s'\n", buf); 

    return 0; 
} 

Beispiel Verwendung/Output

$ ./bin/strncpy 
'This ' 

Blick über Dinge und lassen Sie mich wissen, wenn Sie Fragen haben.

+2

Extra Speicherverbraucher :) – snr

+0

Yup - Speicher Schwein (alle 13 Bytes ':)' –

Verwandte Themen