2009-10-01 9 views
1

Je veux être en mesure d'avoir une entrée d'utilisateur a-z ou c-z ou c-p ou quoi que ce soit et qu'il retourne les lettres entre les deux. Je pensais que je dois utiliser la numérotation ASCII pour que je puisse utiliser ces étapes:Convertir a-z pour imprimer abcdef .... z?

  1. Rechercher « - », si elle est vraie

  2. Regardez le premier caractère qui était entrée (char un en az), trouver ASCII #

  3. Regardez le dernier caractère qui était entrée (char z az), trouver ASCII #

  4. Imprimer première lettre basée sur ASCII #, puis avec une impression en boucle le reste, jusqu'à la dernière lettre en az (dans ce cas être z).

Voici mon code jusqu'à maintenant, mais je pense que c'est loin. Je n'ai pas une bonne compréhension de l'ASCII en C, si c'est ce dont j'ai besoin.

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

void expand (char s1[], char s2[]){ 
    int j = 0; 
    for (j; j <= s1[j-1]; ++j){ 
     if(s1[j+2] = '-'){ 
      while(j <= 70){ 
       ++j; 
       printf("%c\n", s1[j]); 
      } 
     }else{ 
      printf("Invalid\n"); 
     } 
    } 
} 

int main(){ 

    int g = 40; 
    char s1[g], s2[g]; 

    printf("Please enter a-z or an equivalent:\n"); 

    scanf("%s", s1); 
    expand(s1, s2); 
    return 0; 
} 
+0

S'il vous plaît votre code en retrait, il le rendre plus lisible. Si vous n'avez pas compris ce que cela signifie, cela signifie simplement ajouter un onglet dans chaque nouveau bloc (un nouveau bloc est un code dans un {}, que ce soit dans une fonction, dans un instant, dans un if, etc.) –

+0

Question intéressante et amusante. – GManNickG

Répondre

2
char i; 
char *str = "c-k"; 
for (i = str[0]; i <= str[2]; i++) { 
    printf("%c", i); 
} 

Le code ne fait pas des conditions beaucoup contrôle/coin erreur, mais vous voyez l'idée.

Si vous avez besoin d'une chaîne résultante au lieu d'imprimer sur l'écran, vous pouvez le faire (en supposant que vous avez validé str être du format désiré):

char i; 
// this will allocate memory so that the result can be stored 
char *rv = (char *)malloc(((str[2] - str[0]) + 1) * sizeof(char)); 
for (i = str[0]; i <= str[2]; i++) { 
    rv[i - str[0]] = i; // i - str[0] will result in 0, 1, 2 everytime you iterate 
} 
rv[i - str[0]] = '\0'; 

Je vous recommande également de consulter les premiers chapitres d'un bon C-book, comme K et R, pour que vous ayez une bonne compréhension de ces choses.

1

Pour commencer, vous pouvez trouver un table of ASCII character codes here. Avec ces codes en main, l'opération devrait devenir relativement simple. Il sera le long de ces lignes (sous forme de pseudo-code):

take_input_from_user(); 
parse_the_input(); 

for (int = first_characters_number, i =< last_characters_number; ++i) 
{ 

    our_character = i; 
    print_out(our_character); 
} 

Pour plus de détails à C, vous pouvez IIRC pas passer un tableau comme celui-ci: function_name(int[] a). IIRC, il doit aller comme function_name(int* a) Vous pouvez alors déférer le pointeur et faire des choses amusantes.

+2

Vous n'avez pas besoin de connaître les codes ASCII pour ce problème. –

+0

Certes, vous n'en avez pas besoin dans ce problème, mais j'ai fourni la référence au cas où il voudrait faire quelque chose comme traiter des lettres majuscules et autres. – ZachS

1

L'idée que vous avez postée dans votre question est correcte, mais je ne suis pas sûr que le code que vous avez écrit essaie d'exprimer cette idée. Je décomposerais le programme en exactement les morceaux que vous avez écrits ci-dessus. J'ai ajouté vos étapes en tant que commentaires dans le code.

char sz[4]; // I'm assuming we're only going to get 3 characters 
printf("Please enter a-z or an equivalent:\n"); 
scanf("%s", s1); 

// You wrote: 
// 1) Look for '-', if true 
// 2) Look at first char that was input(char a in a-z), find ASCII # 
// 3) Look at last char that was input (char z in a-z), find ASCII # 
// 
// sz[0] is the first char that was input, sz[1] the dash, sz[2] the last char 
// the number of letters you need to print is sz[2] - sz[0] (+1 if you want the. 
// actual letter that appears in after the dash, which you do). 

int numOfLettersToPrint = sz[2] - sz[0] + 1; 

// Your next step is: 
// 
// 4) Print first letter based on ASCII #, then with a loop print the rest, up until the last letter in a-z (in that case being z). 
for (int i = 0; i < numOfLettersToPrint; i++) { 
    // Here, we want to actually print the letter. 
    // sz[0] is the first letter, for example a. We add "i" to it so it goes up by one every time. 
    printf("%c", sz[0] + i); 
} 
+1

Pour garantir seulement trois caractères en entrée, utilisez "% .3s"! –

-1

C'est à peu près l'approche standard de ce problème.

#define z 2*(c<d)-1 
int d;int main(int c,char**v){c=v[1][0],d=v[1][2],d+=z;for(;c-d;c+=z)putchar(c);} 
 
$ ./az a-e 
abcde 
$ ./az z-q 
zyxwvutsrq