sprintf mit wiederholenden Argumenten

Herakles

Profifragensteller
Moin!

Ich habe ein sprintf, in dem sich ein Argument mehrere Male wiederholt.

Code:
  sprintf(buf,"ifconfig %s up; ifconfig %s 192.168.1.3; sleep 1; ifconfig %s down;"
 	"ifconfig %s hw ether ff:ee:dd:cc:bb:aa;"
	"ifconfig %s up",VIRTUAL_DEVICE,VIRTUAL_DEVICE,VIRTUAL_DEVICE,VIRTUAL_DEVICE,VIRTUAL_DEVICE);

Kann man das nicht komfortabler lösen? Irgendwie sagen, dass VIRTUAL_DEVICE fünf mal vorkommt? Sieht irgendwie scheisse aus und ich bin doch Code-Esthetiker :-)

Herakles
 
In gawk (nicht im BSD (n)awk) ist folgendes möglich:
Code:
# gawk 'BEGIN { a = "Hallo"; printf("%1$s %1$s\n%1$s\n", a); }'
Hallo Hallo
Hallo

In C ist mir keine Möglichkeit bekannt das umzusetzen; das muss aber nichts heißen, kenne mich mit C nicht gut aus und meide es, wo ich kann ;)

Aus dem "GNU Awk users guide":
An integer constant followed by a `$' is a positional specifier [...]
Du könntest also mal nach 'positional specifier' googeln.
 
Zuletzt bearbeitet:
@aspiring: GROSSARTIG! Dankeschön!

Die Syntax ist "%n$FORMAT", wobei n das Argument ist, auf das zugegriffen werden soll und FORMAT das printf-übliche Format ist.

In meinem Beispiel von oben sähe das also so aus:

Code:
sprintf(buf,"ifconfig %1$s up; ifconfig %1$s 192.168.1.3; sleep 1; ifconfig %1$s down;"
 	"ifconfig %1$s hw ether ff:ee:dd:cc:bb:aa;"
	"ifconfig %1$s up",VIRTUAL_DEVICE);

Ich nutze also zuerst das "%", um einzuleiten, dass nun ein Format-Argmuent folgt. Dann die "1$", um zu indizieren, dass das erste Element in der eingeklammerten Liste nach den Anführungszeichen von printf() genutzt werden soll und zum Schluss noch das "s", um zu sagen, dass es sich um einen "String of characters" handelt.

Noch ein einfacheres Beispiel:

Code:
#include <stdio.h>
#include <stdlib.h>

struct test1 {
   char a;
   int b;
};

union test2 {
   char a;
   int b;
};

int main(void) {
   printf("Struct benoetigt %1$d, Union benuetigt %2$d Bytes.\n", sizeof(struct test1), sizeof(union test2));
   return EXIT_SUCCESS;
}

Die Ausgabe hier sieht so aus:

struct benoetigt 8, Union benuetigt 4 Bytes.

Herrlich!!!!!
Danke für den Tipp, Herakles
 
Zurück
Oben