Преобразовать a-z, чтобы распечатать abcdef .... z? - PullRequest
1 голос
/ 02 октября 2009

Я хочу, чтобы пользователь мог вводить a-z или c-z или c-p или что-то еще, и чтобы он возвращал действительные буквы между этими двумя. Я подумал, что мне придется использовать нумерацию ASCII, чтобы я мог использовать эти шаги:

  1. Ищите '-', если верно

  2. Посмотрите на первый символ, который был введен (char a in a-z), найдите ASCII #

  3. Посмотрите на последний введенный символ (символ z в a-z), найдите ASCII #

  4. Напечатайте первую букву на основе ASCII #, затем с помощью цикла напечатайте остальные, вплоть до последней буквы в a-z (в данном случае это z).

Вот мой код, но я думаю, что это далеко. Я плохо разбираюсь в ASCII в C, если это то, что мне даже нужно.

#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;
}

Ответы [ 4 ]

2 голосов
/ 02 октября 2009
char i;
char *str = "c-k";
for (i = str[0]; i <= str[2]; i++) {
    printf("%c", i);
}

Код не выполняет много проверок ошибок / угловых условий, но вы поняли идею.

Если вам нужна результирующая строка вместо того, чтобы печатать ее на экране, вы можете сделать это (при условии, что вы подтвердили str в желаемом формате):

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';

Я также рекомендую прочитать первые несколько глав хорошей C-книги, например, K и R, чтобы вы хорошо разбирались в таких вещах.

1 голос
/ 02 октября 2009

Идея, которую вы разместили в своем вопросе, верна, но я не уверен, как именно написанный вами код пытается выразить эту идею. Я бы разбил программу на части, которые вы написали выше. Я добавил ваши шаги как комментарии в коде.

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 голос
/ 02 октября 2009

Для начала, вы можете найти здесь таблицу кодов символов ASCII. С этими кодами в руках операция должна стать относительно простой. Это пойдет по следующим направлениям (в форме псевдокода):

take_input_from_user();
parse_the_input();

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

    our_character = i;
    print_out(our_character);
}

Для более подробной информации о C, IIRC вы не можете передать массив, подобный этому: function_name(int[] a). IIRC, он должен идти как function_name(int* a ) Вы можете отложить указатель и делать забавные вещи.

0 голосов
/ 02 октября 2009

Это в значительной степени стандартный подход к этой проблеме.

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...