2012-03-24 5 views
2

Ich muss eine existierende C-Datei korrigieren, die eine Reihe von Formatspezifizierungskompilierungsfehlern enthält. Kann jemand die richtigen Formatbezeich für die folgenden Fälle sagen:u_char (*) [10] & char (*) [10] Formatbezeichner in C

  1. u_char(*) [10] (I% s versucht, aber hat nicht funktioniert)

  2. char(*) [10] (I% s und% c versucht, aber didn 't arbeiten)

Danke.

+0

Versuchen Sie '% p', das funktioniert für alle Zeiger. –

+0

@NikolaiNFetisov: Überhaupt nicht: '% p' * nur * funktioniert für' void * '(oder CV-qualifizierte Versionen davon), alles andere ist UB. –

Antwort

4

Beide sind Zeiger auf Arrays, so dass Sie dereferenzieren sie Arrays zu werden, die Verwesung Zeiger-to-first-Element:

char arr[10]; 

char (*pa)[10] = &arr; 
printf("%s", *pa); // or &((*pa)[0]) 

es zu buchstabieren: die Art der pa ist char(*)[10] und die Art von *pa ist char[10], und die letztere zerfällt zu einer char* von Wert &((*pa)[0]) (gleich &(arr[0])).

+0

Warum konnten Sie nicht einfach 'printf ("% s ", & arr [0])'? Ist "char arr [10]" nicht auch technisch ein Zeiger? –

+0

@HunterMcMillen: Sie könnten, oder Sie könnten einfach 'printf ("% s ", arr);' sagen, aber das hat nichts mit der ursprünglichen Frage zu tun. 'arr' ist nur hier für die Exposition und um' pa' einen bedeutungsvollen Wert zu geben. –

0

ich mit Kerrek einverstanden sind, aber ich denke,

printf ("%s", *pa); 

nicht so, da wir können arbeiten, ist nicht sicher, ob es am Ende ein NULL-Zeichen ist. So können wir folgendes drucken

char temp[10+1]; 
memcpy(temp, *pa, 10); 
temp[10] = '\0'; 
printf("%s",temp); 
+0

Wenn Sie sich über nicht-null-terminierte Daten Sorgen machen, sind verschwenderische Kopien keine Lösung. 'printf' hat Präzisions-Spezifikatoren aus einem bestimmten Grund. Verwende 'printf ("% .10s ", * pa);' –