2010-12-02 25 views
1

Salut à tous les experts C (s'il vous plaît ne tirez pas, je ne suis pas programmeur C plus, mais de temps en temps, j'ai une question qui apparaît dans mon esprit)Loops in C challenge: peut-il être fait autrement?

Je lisais une autre question (How to print an entered string backwards in C using only a for loop).

Le « simple » et la réponse la plus logique est

for (x = end; x >= 0; --x) { 
    printf("%c", word[x]); 
} 

Mais je me demandais s'il n'y avait pas un moyen d'atteindre le même objectif, mais rester plus près de la boucle d'origine poseted:

for (x = word[end]; x >= word[0]; x--) { 
    printf("%c", x); 
} 

Je ne sais pas assez C pour le travailler, mais ne pourrait-on jouer avec les pointeurs de tableaux à boucle à travers

char * wordp; 
for(wordp = &word[end]; /*something*/; wordp--){\ 
    printf("%c", &wordp); 
} 

P.S .: Je ne me soucie pas vraiment si c'est une boucle en avant ou en arrière.

P.P.S .: Désolé si j'ai fait des erreurs évidentes C dans les pointeurs; signalez-les dans le commentaire et je les éditerai. ;)

Jason

+0

Bien sûr, vous pouvez, et il peut être plus efficace puisque incréments sont plus rapides que des ajouts sur certaines architectures. Un bon compilateur devrait cependant générer le même code avec les deux approches. –

Répondre

4

Absolument.

char *wordp; 

for(wordp = word + end; wordp >= word; wordp--){ 
    printf("%c", *wordp); 
} 
+1

... et c'est comme ça que les itérateurs STL sont utilisés – Javier

+0

Je dois dire que je dois admirer les possibilités de C: P. ce qui me manquait, c'est comment comparer wordp> = mot, je connais fondamentalement les pointeurs et peut être comparé mais je ne savais pas qu'ils étaient forcément commandés de plus en plus petit dans un tableau (ça sonne logique lol). ce truc peut-il être extracteur avec des tableaux/listes dynamiques? est réellement le> = nécessaire? pourriez-vous simplement le mettre ==? –

+0

@Jason: En raison de la nature de la structure et de la boucle, nous devons la traiter comme une condition aux limites, et non comme une condition d'événement. –

1
for (x = word[end]; x >= word[0]; x--) { 
    printf("%c", x); 
} 

ne fonctionnera pas, comme mot [fin] est équivalent à * (mot + fin). Il est déjà déréférencé, donc x sera mis à la valeur du dernier char et bouclera jusqu'à ce qu'il soit égal à la valeur char du premier char. En bref, cela n'a aucun sens.

Essayez:

char * wordp; 
for(wordp = (word + end); wordp >= word; wordp--){\ 
    printf("%c", *wordp); 
} 

Rappelez-vous qu'un tableau est simplement un pointeur sur son premier élément.

1

Vous pouvez faire:

char * wordp; 
    for(wordp = &word[end]; wordp >= word ; wordp--){\ 
      printf("%c", *wordp); 
    } 
+0

N'imprime pas le mot [0] ' – aschepler

+0

@aschepler: Bonne prise. Merci. – codaddict

1

Les vrais programmeurs utilisent récursion:

void revputs(char *s) { 
    if (*s) { revputs(s + 1); putchar(*s); } 
} 
+0

Les programmeurs REAL utilisent la récursivité quand ils en ont besoin et ils ne ressentent pas le besoin de s'en vanter. sinon bonne solution ^^ –